这是一个玩具示例,旨在帮助解决我遇到的更大问题。它本质上涉及在引用更大的宏变量名称时使用 %eval() 宏。
我创建了一个宏变量 x_2,它使用循环“&it”的值,从最终输出可以看出该变量已成功创建,但是我只能将其放入日志而不评估 &it+1,这当使用大于尺寸 1 的循环时我需要这样做。
它似乎首先解析 x_,给出警告,然后再评估 x_2 作为一个整体并给出输出。
我意识到这只是一个关于如何正确引用宏的问题,但我找不到任何使用评估作为宏变量名称的一部分的示例。
Thanks.
%macro testing;
%DO it = 1 %TO 1;
data dataset;
s=100;
t=99;
run;
data _null_;
set dataset;
if s = 100 then do;
call symput("x_%eval(&it+1)",t);
end;
run;
%put "&x_%eval(&it+1)";
%put &x_2;
%END;
%mend testing;
%testing;
日志输出
MLOGIC(TESTING): %PUT "&x_%eval(&it+1)"
WARNING: Apparent symbolic reference X_ not resolved.
SYMBOLGEN: Macro variable IT resolves to 1
SYMBOLGEN: Macro variable X_2 resolves to 99
" 99"
MLOGIC(TESTING): %PUT &x_2
SYMBOLGEN: Macro variable X_2 resolves to 99
99
MLOGIC(TESTING): %DO loop index variable IT is now 2; loop will not iterate again.
MLOGIC(TESTING): Ending execution.
事实上,SAS 在调用 %eval 函数之前进行变量替换
最简单的解决方案是在前面的语句中调用 %eval
%let xNr = %eval(&it+1);
%put "&&x_&xNr";
双与号用于延迟评估x_&xNr
until &xNr
被评估为2
并且没有警告x_
未定义。
SYMBOLGEN: Macro variable IT resolves to 1
SYMBOLGEN: && resolves to &.
SYMBOLGEN: Macro variable XNR resolves to 2
SYMBOLGEN: Macro variable X_2 resolves to 99
" 99"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)