SAS Macro GLOBAL сфера применения - PullRequest
3 голосов
/ 05 марта 2009

Есть ли короткий способ сделать ВСЕ макропеременные, созданные внутри макроса, глобальными по объему?

е:

%macro x;  
 %global _all_;  * ??? ;  
 %let x=1;  
 %let y=1;  
 %let z=1;  
%mend;

Ответы [ 3 ]

5 голосов
/ 06 марта 2009

Единственный способ, которым я могу придумать, это сделать без необходимости заранее объявлять каждый макрос глобальным, а затем выполнить оператор% let, это использовать макрос вместо оператор% let.

В приведенном ниже коде я создаю макрос с именем % mylet , единственной целью которого является создание глобальной переменной с именем и значением, которое я передаю в качестве аргументов. Затем я использую этот макрос вместо% let везде, где я хочу определить глобальные переменные.

например.

%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;
4 голосов
/ 05 марта 2009

Если вы создадите макропеременную в открытом коде, макропеременная будет автоматически добавлена ​​в глобальную таблицу символов макроса:

%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;
3 голосов
/ 24 марта 2009

Если вы создаете макропеременные внутри шага данных, и этот шаг данных находится внутри макроса, созданные макропеременные будут по умолчанию локальными в области действия этого макроса.

Использование

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

для создания глобальных макропеременных.

...