2014-10-08 2 views
2

나는 몇 년 동안 실행하고 싶은 프로그램이 있습니다. 따라서 약간의 시간에 나는 몇 년에 시도하기 위해 내 데이터SAS 매크로 변수를 호출합니다.

data want; 
    set have(where='2014'); 
    run; 

을 선택해야합니다, 나는

%let an=14 
/*It is 14 and not 2014, because elsewhere I need it that way.*/ 

로 정의하지만 난에 넣어 시도 할 때, 매크로 변수가 내 변화 : 그것은 모든

data want; 
    set have(where="&&20&an."); 
    run; 

에서 작동하지 않는 프로그램 내가 도움을

먼저 편집을 부탁드립니다 "에 d를 ''",하지만 여전히

두 번째 편집 일을하고

응답하지 않습니다 "20 &에"

+2

매크로 변수에 해결 큰 따옴표를 사용하면 "20 & an."만 필요할 것입니다. 일부. – Reeza

+0

팁 주셔서 감사합니다, 그것은 "20 & an"과 함께 작동합니다. 하지만 "&& 20 & an."에서는 작동하지 않습니다. 그것이 효과가있어 행복하지만 다른 이유가 무엇인지 알면 기꺼이 설명을 듣겠습니다. –

+1

앰퍼샌드는 주로 매크로 변수를 해결하는 데 사용됩니다. 20 & an, &에 대해 & 14는 20으로 합치면 2014가됩니다. && 20 &는 & 2014가되지만 매크로 변수 2014가 없으므로 && 20 & an이 작동하지 않습니다. – Amir

답변

3

당신이에 도착 대답 (20&an) 올 - 당신이 모든 설정을 . 내가 게시 한이 답변의 나머지 부분을 읽을 필요가 없습니다.

&&&에 대해 약간 혼란 스러웠습니다. 이에 대해 더 자세히 알고 싶다면 &&&의 차이점과 &&의 목적을 SAS 매크로 평가에 함께 추가했습니다.

&이 가장 일반적인 기호입니다. 단순히 변수를 평가/참조 해제하기 위해 사용합니다. 그래서 :

%LET an = 14 ; 
%PUT ----- an ; 
%PUT ----- &an ; 

출력 : 당신이 볼 수있는

----- an 
----- 14 

그래서, 당신은 해제 참조하는 가치에 그것을 위해 변수 이름 앞에 &을 넣어해야합니다. &을 생략하면 문자열 an 만 출력되며이 경우 변수의 이름이됩니다. 대부분의 매크로 코딩에서는 & 만 있으면됩니다. SAS 매크로 &&&은 무엇이며, 지금은 등, 쉘, C에서 *에서 $처럼


입니까? 동적 매크로 변수 이름을 가질 수 있도록하기 위해 존재합니다. 즉, 값이 다른 매크로 변수의 이름 인 매크로 변수를 갖는 것입니다. C에 익숙하다면 포인터에 대한 포인터라고 생각할 수 있습니다.

SAS가 평가하는 방법은 &&입니다. 첫 번째 단계에서는 &&&으로 변환합니다. 동시에, 그 패스에있는 어떤 & 심볼도 그들이 옆에있는 변수 이름의 참조를 해제하는 데 사용됩니다. 아이디어는이 후자의 표현식을 변수 이름으로 해석하는 것입니다. 그런 다음 두 번째 단계에서 나머지 & 기호 (모두 원래 && 기호)는 현재 자신이 옆에있는 변수 이름을 참조 해제합니다.여기

샘플 출력 예입니다

%LET x = 3; 
%LET name_of_variable = x; 

%PUT ----- &x; 
%PUT ----- &&name_of_variable; 
%PUT ----- &&&name_of_variable; 

출력 :

%PUT에서
----- 3 
----- x 
----- 3 

, 우리는 그냥 평범한 오래된 &를 사용하고, 따라서 우리는 우리가 전에했던 일을하고 있습니다 x 값을 읽고 인쇄하십시오. 두번째 %PUT에서는 일들이 좀 더 흥미로워집니다. && 때문에 SAS는 두 가지 평가 과정을 거칩니다. 을 될 일이 문자열 x - 두 번째 패스에서이

%PUT ----- &name_of_variable; 

는, SAS는 name_of_variable에서 개최 된 값을 출력하는 표준 & 평가를 수행

%PUT ----- &&name_of_variable; 

에 : 첫 번째는이 변환 우리가 사용하고있는 다른 변수의 이름. 물론,이 예제는 특별히 고안된 것입니다 : 을 쓸 수 있었을 때 &&name_of_variable을 쓰는 이유는 무엇입니까?

&&&이있는 세 번째 %PUT에는 SAS가 두 번 통과합니다. 여기서 우리는 결국 &&의 진정한 목적을 볼 수 있습니다. 저는 표현의 일부분을 괄호 안에 넣어서 어떻게 평가되는지 볼 수 있습니다. 우리는이에서 이동 :

%PUT ----- (&&)(&name_of_variable); 

이 사람 :

%PUT ----- &x; 

그래서 첫 번째 패스에서 &&&로 변환되고, &name_of_variable가에 평가, name_of_variable의 간단한 드 참조했다 우리가 말한대로 x 인 내용이 있습니다.

은 그래서 두 번째 패스에서, 우리는 단지 간단한 평가와 함께 남아 있습니다 :

우리가 x 동일한 3으로 설정했듯이
%PUT ----- &x; 

이 말하는, 그래서 어떤 의미에서 3

로 평가 &&&name_of_variable은 "이름이 name_of_variable.에 저장되어있는 변수의 값을 보여 줘야합니다."

여기에 왜 그렇게하고 싶은지에 대한 동기가되는 예제가 있습니다. SAS 매크로 변수에 저장된 숫자 값에 임의의 숫자를 추가 한 간단한 매크로 서브 루틴이 있다고 가정합니다. 이를 위해 서브 루틴은 추가 할 양을 알아야하지만 더 중요한 것은 추가 할 변수의 이름을 알아야한다는 것입니다. 당신은 너무처럼 && 메커니즘을 통해이 동적 변수 이름을 수행 할 것입니다 :

여기
%MACRO increment_by_amount (var_name = , amount =); 
    %LET &var_name = %EVAL (&&&var_name + &amount) ; 
    /* Note: this could also begin with %LET &&var_name = .... */ 
%MEND; 

우리가 말하는 : "누구의 이름으로 개최되는 var_name (즉 &var_name) 이름입니다 변수의 값을 동일 변수를 보자 var_name (예 : &&&var_name)에 보유 된 값에 amount (즉, &amount)이 들어 있습니다.

이와 같은 서브 루틴을 호출 할 때 값이 아닌 이름을 전달해야합니다. 즉,이 말을한다 :

%increment_by_amount (var_name = x , amount = 3); 

을이 없음 :

%increment_by_amount (var_name = &x , amount = 3); 

그래서 호출의 예는 다음과 같습니다

%LET x = 3; 
%PUT ----- &x; 
%increment_by_amount (var_name = x , amount = 3); 
%PUT ----- &x; 

출력 :

----- 3 
----- 6 
+1

나는 내일 잠을 자고 나면 그 책을 읽을 것이다. –

+0

언제든지. 나는 자고 있다고 들었어! –

+1

매우 명확하고 교훈적입니다. 내 제목이 애매해서 다행이라면, 아마도 다른 사람들이 당신의 명확하고 유용한 답변을 찾을 수있게 될 것입니다! –