2015-12-03 252 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