문제

매크로 글로벌 내부에서 모든 매크로 변수를 스코프로 만들 수있는 짧은 방법이 있습니까?

즉:

%macro x;  
 %global _all_;  * ??? ;  
 %let x=1;  
 %let y=1;  
 %let z=1;  
%mend;
도움이 되었습니까?

해결책

각 매크로를 글로벌로 미리 선언하지 않고이 작업을 수행 할 수있는 유일한 방법은 %LET 진술을 수행하는 것입니다. 대신에 %let 문.

아래 코드에서 나는 호출 된 매크로를 만듭니다. %mylet 그것은 단독 목적으로 내가 인수로 전달한 이름과 가치를 가진 글로벌 변수를 만드는 과제입니다. 그런 다음이 매크로를 %대신에 사용합니다.

예를 들어.

%global myvar;
%let myvar=2;

될거야 ...

%mylet(myvar,2);

/* Define a macro to declare variables as global */
%macro mylet(var,value);
  %global &var;
  %let &var.= &value ;
%mend;

/* Test macro */
%macro test;
 %mylet(myvar,2);
 %mylet(myvar2,12);
 %mylet(myvar3,'string');

/* see that they are global inside the macro */
title "Macro scope inside test macro";
proc sql;
    select *
       from dictionary.macros
       where name in('MYVAR','MYVAR2','MYVAR3');
quit;

%mend;
%test;

/* Check to see if they are still global outside the macro */
title "Macro scope outside test macro";
proc sql;
    select *
       from dictionary.macros
       where name in('MYVAR','MYVAR2','MYVAR3');
quit;

다른 팁

오픈 코드 내에서 매크로 변수를 작성하면 매크로 변수가 전역 매크로 심볼 테이블에 자동으로 추가됩니다.

%let x=1;  
%let y=1;  
%let z=1; 

이것은 될 것입니다 ~ 전에 더 큰 매크로를 만듭니다.

%macro x;
  <code here>
%mend x;

또 다른 대안은 데이터 단계를 사용하여 변수를 만드는 것입니다.

data _null_;
    set LIB.DSET;
    x = 1;
    call symput('x',x);
run;

데이터 단계 내에서 매크로 변수를 생성하고 해당 데이터 단계가 매크로 내부에 있으면 생성 된 매크로 변수는 기본적으로 해당 매크로의 범위가 로컬입니다.

사용

call symputx('macvar',macval,'g'); 

글로벌 매크로 변수를 생성합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top