SAS : 하나의 매크로를 다른 매크로로 호출… 매크로 정의의 순서

StackOverflow https://stackoverflow.com/questions/537283

  •  22-08-2019
  •  | 
  •  

문제

내 코드에는 여러 개의 매크로가 있습니다. 매크로 A는 메인 매크로입니다. 매크로 A는 매크로 B를 호출하여 매크로 C라고 부릅니다.

SAS에서는 뒤로 순서대로 정의해야합니까? 다시 말해서, 매크로 C를 먼저 정의 한 다음 매크로 B, 매크로 A를 마지막으로 정의해야합니까? 아니면 SAS가 실제로 매크로를 실행하기 위해 명령에 부딪 치기 전에 모든 코드를 읽으므로 중요합니까? 그 문제에 대해, 내 코드의 첫 번째 문으로 매크로를 실행하도록 명령을 발행 한 다음 명령 아래의 매크로를 정의 할 수 있습니까?

감사!

도움이 되었습니까?

해결책

먼저, 매크로가 호출되기 전에 매크로를 정의해야합니다.

둘째, 미리로드 한 한 매크로가 어디에서 호출되는지는 중요하지 않습니다.

귀하의 문제에 대해 자세히 설명하기 위해 : AutoCall 라이브러리는 친구입니다. SAS 관리자가 매크로를 AutoCall 라이브러리에 넣을 수 없다면 AutoCall을 다음과 같이 추가 할 수 있습니다.

filename mymacros 'c:\mysas'; 
/*this defines the directory you have stored your macros*/

options sasautos=(sasautos mymacros) mautosource; 

다른 팁

매크로는 호출되기 전에 정의되어야합니다. 성능의 이유로, 매크로를 다른 내부에 정의하지 않는 것이 가장 좋습니다. 그렇게하면 외부 매크로를 호출 할 때마다 다시 정의됩니다. 다음은 잘 작동합니다.

%macro a;
  %put a;
  %b
%mend a;

%macro b;
  %put b;
  %c
%mend b;

%macro c;
  %put c;
%mend c;

%*-- %a is main --*;
%a
/* on log
a
b
c
*/

"%a"가있는 선은 매크로를 정의해야합니다. 따라서 "%a"라인은 매크로 A의 정의를 따라야합니다. 다른 매크로 정의의 순서는 호출되기 전에 정의되는 한 중요하지 않습니다. 일반적으로 내 프로그램에서 나는 당신이 설명하는 것처럼 메인 매크로를 설정 한 다음 프로그램의 마지막 줄은 이것을 매크로라고합니다.

고려해야 할 또 다른 옵션은 많은 매크로의 정의를 포함하는 매크로 autocall 라이브러리를 설정하는 것입니다. 이것은 재사용 가능한 매크로에 가장 적합하므로 각 프로그램에서이를 재정의 할 필요가 없습니다.

SAS에는 매크로 코드의 두 가지 측면이 있습니다 : 컴파일되는 매크로 코드와 매크로 매개 변수 :

매크로 코드 :

매크로 코드 자체는 %macro Token은 SAS 시스템이 SAS 매크로를 컴파일하기 시작하고 A가 발생할 때까지 계속 컴파일됩니다. %mend 토큰. 당신이 제기 할 수있는 유일한 문제는 매크로 코드를 업데이트하고 실행하기 전에 다시 컴파일하지 않는 것입니다. 이러한 상황에서는 여전히 매크로 라이브러리에있는 이전 버전을 실행합니다. 확장에 따라 아직 정의되지 않은 다른 매크로를 호출하는 매크로를 컴파일하려고하면 오류가 발생합니다. 이러한 이유로, 그들은 호출되는 순서로 프로그래밍되어야합니다 (아래 예 : %level3은 %level2 앞에 온다.

매크로 변수 :매크로를 정의 할 때 변수 글로벌과 로컬의 두 가지 범위가 있습니다. 정의되면 글로벌 변수는 언제 어디서나 액세스 할 수 있습니다. 그러나 로컬 변수는 정의 된 매크로를 실행하는 동안로 국소 적으로 만 존재합니다. 연장하여 로컬 변수가 정의 된 매크로가 다른 매크로를 호출하는 경우 로컬 매크로 변수에 여전히 액세스 할 수 있습니다.

Working Example:

다음 예에서는 매크로가 있습니다 역 순서로 정의됩니다 SAS가 반환을 방지하기 위해 매크로의 명백한 호출 경고.

아래 다이어그램은 다음 예에서 다음 매크로의 구조를 보여줍니다.

|-----------------------------|
|GLOBAL                       |
|  |------------------------| |
|  |LEVEL1                  | |
|  |  |-------------------| | |
|  |  |LEVEL2             | | |
|  |  |  |--------------| | | |
|  |  |  |  LEVEL3      | | | |
|  |  |  |--------------| | | |
|  |  |-------------------| | |
|  |------------------------| |
|-----------------------------|

중첩 된 매크로를 컴파일하십시오.

 %macro level3 ;
  %put **** START LEVEL3 **** ;
  %local G1;
  %let G1=Local ;

  %do i=1 %to 2 ;
    %put In the macro do loop I=&i ;
  %end ;

  %put The value of I at level3 is: &I ;
  %put Are we accessing global or local G1 variable here: &G1 ;

  %put **** END LEVEL3 ****;
%mend level3 ;


 %macro level2 ;
  %put **** START LEVEL2 **** ;
  %*global L1 ; *<-- this would produce an error because the variable name has already been added to the local scope in %level1 ;

  %put Are we accessing global or local G1 variable here: &G1 ;
  %put Can we access local variables here: &L1 ;

  %level3 ;

  %put The value of I in level2 is: &I ;
  %put **** END LEVEL2 ****;
%mend level2 ;

최상위 매크로를 컴파일하고 (위의 두 매크로를 호출) 실행하십시오.

%let G1=Global;
%macro level1 ;
  %put **** START LEVEL1 **** ;
  %let L1=Yes;

  %put Are we accessing global or local G1 variable here: &G1 ;
  %put Can we access local variables here: &L1 ;

  %level2 ;

  %put The value of I outside of the local macro is: &I ;
  %put Are we accessing global or local G1 variable here: &G1 ;

  %put **** END LEVEL1 ****;
%mend level1 ;
%level1 ;

로그를 검토 할 때 주목해야 할 사항 :

  • %level3 이외의 & I는 매크로 변수가 존재하지 않는다는 경고를 반환합니다.
  • %level3 내에서 & g1이 호출되면 %level3의 로컬 범위에 저장된 값을 반환합니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top