sas, как сделать все переменные в макросе локальными? - PullRequest
2 голосов
/ 10 августа 2011

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

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

Ответы [ 2 ]

1 голос
/ 12 августа 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) Обратите внимание, что итеративный макрос предназначен только для примера и никоим образом не должен загрязнять ваш собственный код.

1 голос
/ 10 августа 2011

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

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

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

Приветствия Роб

...