2015-12-03 251 views
2

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

我已经创建了一个宏变量x_2,它使用循环'&它'的值,该变量已成功创建,可以通过最终输出看到,但是我只能将它放到日志中而不进行评估它使用+ 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. 

回答

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" 
+0

谢谢你们,我一直在尝试各种各样的组合方式(类似于昆汀和盛林,他们实际上很成功),但我并没有想过把它分开! – AP30

0

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

+0

好想,但不幸的是,这还不足以防止SAS试图解析&x_。 – Quentin

+0

尝试使用%superq:%put%superq(x_%eval(&it + 1)); –

2

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

​​
+0

非常优雅,如果你只有一个编号的变量_列表(值得我的upvote)_,但是如果你有两个列表,比如'X_1','X_2','X_3',...和'Y_1', 'Y_2','Y_3',... –

2

同意德克的回答。但作为一个思想的锻炼,就可以实现与丑陋使用引用功能所需的结果:

%let x_2=99; 
%let it=1; 
%put %unquote(%nrstr(&x_)%eval(&it+1)); 

那么%nrstr隐藏&直到%EVAL完成工作后(我认为:)

更新:

@Shenglin加入评论了类似的回答,我喜欢比我上面的方法更好:

%put %superq(x_%eval(&it+1)); 

这工作BEC ause%superq()在将宏变量名称作为参数(不是前导&)而不是宏变量引用时是不寻常的。因此,您可以使用%EVAL生成宏变量的部分名称。如果需要,你可以%unquote(),但它不应该是必需的。

+0

谢谢,我太专注于试图在一行中解决它我错过了更简单的两行解决方案,很高兴看到它是可能的。 – AP30