在宏变量名称SAS中解析包含%eval的宏

时间:2015-12-03 11:06:33

标签: variables macros sas eval

这是一个玩具示例,以帮助解决我遇到的更大问题。它主要涉及在引用更大的宏变量名时使用%eval()宏。

我创建了一个宏变量x_2,它使用循环的值'& it',变量被成功创建,正如最终输出所见,但是我只能将它放到日志中而不进行评估& it + 1,当使用大于1的循环时我需要做。

在将x_2作为一个整体进行评估并给出输出之前,似乎先解决x_,然后发出警告。

我意识到这只是一个关于如何正确引用宏的问题,但是我找不到任何使用评估作为宏变量名称的一部分的例子。

感谢。

%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;

LOG OUTPUT

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.

4 个答案:

答案 0 :(得分:5)

实际上,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"

答案 1 :(得分:2)

将宏变量名称构建到另一个变量中然后展开该值会更容易。

%let t2=found;
%let mvar=t%eval(1+1);
%put &&&mvar;

答案 2 :(得分:2)

同意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(),但它不应该是必需的。

答案 3 :(得分:0)

你能试试"&&x_%eval(&it+1)"吗?