簡體   English   中英

在宏變量名稱SAS中解析包含%eval的宏

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM