sas как сделать все переменные в макросе локальными?

В моем коде есть много макросов внутри других на многих уровнях. Большинство макропеременных одинаковы (даты), но иногда я хочу запустить макрос с другой датой - тогда мои переменные сталкиваются.

Как я могу указать, что все переменные, которые будут появляться в макросе, должны быть локальными, не используя столько раз %local? Для вложенных макросов значения переменных более глубокого уровня заражают переменные более высоких уровней.


person Catherine    schedule 10.08.2011    source источник
comment
Пожалуйста, опубликуйте пример кода. Если показать, как создаются макросы, можно дать больше советов.   -  person Jay Corbett    schedule 11.08.2011


Ответы (2)


Вы должны явно перечислять их с помощью %local каждый раз. К сожалению, короткого пути нет.

Кроме того, если у вас возникли проблемы с устранением неполадок с вложенными макросами, один совет, который облегчил мне задачу, заключался в том, чтобы изменить мои стандарты, чтобы я никогда не изменял значение каких-либо параметров макроса (входных). Эта простая концепция значительно упрощает отладку.

И если у вас есть операторы %include в ваших макросах, добавьте «опцию source2», чтобы исходный код из них также отображался в журнале.

Ура Роб

person Robert Penridge    schedule 10.08.2011

Другой вариант — определить переменные как параметры макроса в строке оператора макроса. Ниже приведена простая программа, которая создает глобальную макропеременную с именем DATE, а затем определяет макрос с параметром, который также называется DATE. Кроме того, макрос вызывает сам себя с другим значением даты (1).

options nosource nonotes;
%let date = '01jan2011'd;
%put Global DATE = &date;

%******************************************************************************;
%macro test_macro_level(date=,nest_level=);

   %put INSIDE MACRO - Nest Level=&nest_level : DATE=&date;

   %if %eval(&nest_level = 1) %then %do;
      %test_macro_level(date='01mar2011'd,nest_level=2);
      %put INSIDE MACRO, AFTER NESTING - Nest Level=&nest_level : DATE=&date;
   %end;

%mend test_macro_level;
%******************************************************************************;
%test_macro_level(date='01feb2011'd,nest_level=1);

%put Return to Global: Date=&date;

Затем файл журнала гласит:

Global DATE = '01jan2011'd
INSIDE MACRO - Nest Level=1 : DATE='01feb2011'd
INSIDE MACRO - Nest Level=2 : DATE='01mar2011'd
INSIDE MACRO, AFTER NESTING - Nest Level=1 : DATE='01feb2011'd
Return to Global: Date='01jan2011'd

(1) Обратите внимание, что итеративный макрос предназначен только для примера и никоим образом не должен загрязнять ваш собственный код.

person RWill    schedule 11.08.2011