在我的代碼中,我在許多層次上有許多其他宏。大多數宏變量是相同的(日期),但有時我想用不同的日期運行一個宏 - 然後我的變量發生衝突。sas如何在宏本地中創建所有變量?
我該如何聲明宏中出現的所有變量都應該是本地的,而不必多次使用%local?對於嵌套宏,來自更深層次的變量值會影響上層的變量。
在我的代碼中,我在許多層次上有許多其他宏。大多數宏變量是相同的(日期),但有時我想用不同的日期運行一個宏 - 然後我的變量發生衝突。sas如何在宏本地中創建所有變量?
我該如何聲明宏中出現的所有變量都應該是本地的,而不必多次使用%local?對於嵌套宏,來自更深層次的變量值會影響上層的變量。
您必須每次使用%local明確列出它們。不幸的是,沒有捷徑。順便說一句,如果您在解決嵌套宏問題時遇到問題,那麼一個讓我更容易的提示是更改我的標準,以便我從不修改任何宏(輸入)參數的值。這個簡單的概念使調試更容易。
如果您碰巧在宏中包含%include語句,請添加'option source2',以便這些源代碼也顯示在日誌中。
乾杯 羅布
另一種方法是定義變量作爲宏觀語句行宏參數。下面是一個簡單的程序,它創建一個名爲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)請注意,迭代宏例如僅不應以任何方式污染你自己的代碼。
請張貼一些示例代碼。如果你展示如何創建宏,可以給出更多的建議。 –