[英]Resolving macro containing %eval in macro variable name, SAS
这是一个玩具示例,以帮助解决我遇到的更大问题。 它主要涉及在引用更大的宏变量名时使用%eval()宏。
我创建了一个宏变量x_2,它使用循环的值'&it',变量被成功创建,如最终输出所示,但是我只能将它放到日志中而不评估&it + 1,使用大于1的循环时我需要做。
它似乎首先解决x_,发出警告,然后再评估x_2作为一个整体并给出输出。
我意识到这只是一个关于如何正确引用宏的问题,但我找不到任何使用评估作为宏变量名称的一部分的示例。
谢谢。
%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
计算,直到&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"
将宏变量名称构建到另一个变量然后展开值要容易得多。
%let t2=found;
%let mvar=t%eval(1+1);
%put &&&mvar;
同意Dirk的回答。 但作为一个思考练习,可以通过丑陋的引用函数来实现所需的结果:
%let x_2=99;
%let it=1;
%put %unquote(%nrstr(&x_)%eval(&it+1));
所以%nrstr隐藏了&%直到%eval完成它的工作后(我想。:)
更新:
@Shenglin在评论中添加了一个类似的答案,我比上面的方法更喜欢:
%put %superq(x_%eval(&it+1));
这是因为%superq()在将宏变量名称作为参数(无前导&)而不是宏变量引用时不常见。 因此,您可以使用%EVAL生成宏变量名称的一部分。 如果需要,你可以%unquote(),但它不应该是必需的。
你能试试"&&x_%eval(&it+1)"
吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.