2017-10-17 13 views
0

해결할 여러 앰퍼샌드가 필요한 매크로 변수 인 % LET 문을 사용하여 로컬 매크로 변수를 만들려고합니다. SAS는 로컬 매크로 변수의 이름을 지정하기 전에 여러 앰퍼샌드를 해결하지 않습니다.SAS는 % LET 매크로 변수에 이중 앰퍼샌드 매크로 변수를 정의합니다.

%macro example; 
%do i=1 %to %sysevalf(&max_n); 
    %let dg= &&max_&i..; 
    {stuff happens here} 
%end; 
%mend; 
%example; 

예 : & max_1. 코드의 {여기서 일어나는} 부분에서 사용하는 APPLE로 해결됩니다. 그러나 SAS는 경고를 내게 보내고 있습니다 "경고 : 명백한 기호 참조 MAX_가 해결되지 않았습니다." 그리고 DG 매크로 변수는 & & max_1에서 & & max_17을 반환합니다. & DG로 전화하십시오. 이 시점에서 & & max_1이 반환됩니다.이 코드는 APPLE로 해석되지만, 표시되지 않는 코드의 구문에는 사용할 수 없습니다.

& DG가되도록 매크로 변수를 만드는 방법을 생각해보십시오. APPLE이 (가) 반환됩니까?

+1

앞에 &를 추가하십시오. – Reeza

답변

2

(이 답변이 아니지만 메모에 형식이 지정된 코드를 게시 할 수 없습니다. 나중에 편집/제거합니다).

여기에 게시 한 코드는 귀하의 범인이 아닙니다. -있는 그대로 내가 가지고가는 경우에, 앞에 몇 가지 변수를 초기화하고 stuff happens%put 문 넣어 :

%let max_1=APPLE; 
%let max_n=1; 

%macro example; 
%do i=1 %to %sysevalf(&max_n); 
    %let dg= &&max_&i..; 
    %put &dg; 
%end; 
%mend; 
%example; 

당신이 붙여 넣기하고 실행/복사 할 수 있으며이 로그에 'APPLE'을 인쇄 할 예상대로를 .

문제의 원인이 되고자하는 일에 더 많은 것이 있어야합니다.

+0

또한 매크로가 호출 될 때 매크로 실행 시간까지 매크로 변수가 확인되지 않거나 부모 또는 현재 범위에 존재하지 않아도됩니다. 따라서 max_1과 max_n의 할당은 매크로 정의 이후와 % 예제 이전에 발생할 수 있습니다. – Richard

+0

오른쪽. 이 상황에서 많은 차이를 만들지 않습니다. – user2877959

+0

당신이 옳습니다. 더 이상 오류가 발생하지 않습니다. 내가 한 모든 일은 SAS에 가까웠다. 나는 그것을 망치고있는 것이 확실하지 않습니다. 더 이상 경고가 표시되지 않습니다. –

1

또한 매크로가 호출 될 때 매크로 실행 시간까지 매크로 변수가 확인되지 않거나 부모 나 현재 범위에 존재할 필요가 없습니다. 따라서 max_1과 max_n의 할당은 매크로 정의 이후와 % 예제 이전에 발생할 수 있습니다.

매크로 호출 이전에 변수에 적용한 매크로 인용이 원인 일 수 있습니다. 호출 수신자 범위에서 매크로 내에서 % unquote를 사용하거나 호출자 범위에서 매크로 확인시 인용 부호를 사용하여 개념 및 입력을 처리하는 방법을 결정할 수 있습니다.

참고 : 숫자로 색인 된 매크로 변수는 때때로 '매크로 배열'이라고도합니다. 기호로 끝나는 매크로 변수는 때로는 '매크로 연관 배열'또는 '매크로 객체'라고합니다.