문제
매크로 글로벌 내부에서 모든 매크로 변수를 스코프로 만들 수있는 짧은 방법이 있습니까?
즉:
%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');
글로벌 매크로 변수를 생성합니다.
제휴하지 않습니다 StackOverflow