[英]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.