ГЛОБАЛЬНАЯ сфера действия SAS Macro
Вопрос
Есть ли короткий способ сделать ВСЕ макропеременные, созданные внутри макроса, глобальными по объему?
то есть:
%macro x;
%global _all_; * ??? ;
%let x=1;
%let y=1;
%let z=1;
%mend;
Решение
Единственный способ, который я могу придумать, чтобы сделать это без необходимости заранее объявлять каждый макрос как глобальный, а затем выполнять оператор %let, - это использовать макрос на месте оператор %let.
В приведенном ниже коде я создаю макрос под названием %милет единственной целью которого является создание глобальной переменной с именем и значением, которые я передаю в качестве аргументов.Затем я использую этот макрос вместо %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;
Другие советы
Если вы создадите макропеременную в открытом коде, макропеременная будет автоматически добавлена в глобальную таблицу символов макросов:
%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');
для создания глобальных макропеременных.