我想循环遍历不同的列表,并根据一个“初始”字符串选择不同的变量集。
示例:我有以下列表和变量集。
%let KRW_list = USD JPY HKD;
%let KRW_vars = FX import export;
%let NZD_list = USD AUD JPY GBP;
%let NZD_vars = FX CA;
现在,如果我有
%let ccy = KRW;
然后我想循环遍历KRW_list中的元素并使用KRW_vars列表中的变量。当然,我可以创建一个将所有3作为参数的宏。但我想要一个只使用ccy作为参数的宏,然后选择正确的字符串列表。我天真地想到了以下几点:
%macro selectlist(ccy1);
%let n = %sysfunc(countw(&ccy1._list));
%do I = 1 %to &n;
proc timeseries data = &ccy1._&ccy2. out= tmp;
.....[some commands] ;
var &ccy1._vars ;
run;
%end;
%mend;
这不起作用。提前谢谢。
答案 0 :(得分:1)
由于围绕宏变量解析的规则,您的代码无效。如果您设置一个宏变量,而该变量又应该解析为另一个,SAS需要知道它必须解决两次:
%let x_list=a b c;
%let y=x;
%put &y._list;
返回x_list
,因为SAS只会将y
解析为x
,然后无法进一步解析。但是:
%put &&y._list;
首先解析& y到x:
&x_list
然后解析为:
a b c
如果您在代码中将&ccy1.
更改为&&ccy1.
,那么它应该按照您的意图运行。
如果您打开OPTIONS SYMBOLGEN;
(只需在代码中包含此语句),这将显示日志中的宏分辨率步骤,这些步骤可帮助您确定SAS在后台执行的操作。
(运行OPTIONS NOSYMBOLGEN;
关闭)