당신이에 도착 대답 (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
매크로 변수에 해결 큰 따옴표를 사용하면 "20 & an."만 필요할 것입니다. 일부. – Reeza
팁 주셔서 감사합니다, 그것은 "20 & an"과 함께 작동합니다. 하지만 "&& 20 & an."에서는 작동하지 않습니다. 그것이 효과가있어 행복하지만 다른 이유가 무엇인지 알면 기꺼이 설명을 듣겠습니다. –
앰퍼샌드는 주로 매크로 변수를 해결하는 데 사용됩니다. 20 & an, &에 대해 & 14는 20으로 합치면 2014가됩니다. && 20 &는 & 2014가되지만 매크로 변수 2014가 없으므로 && 20 & an이 작동하지 않습니다. – Amir