2014-10-08 83 views
2

我有一個程序,我想運行幾年。因此,在一段時間內我必須選擇我的數據SAS調用一個宏變量

data want; 
    set have(where='2014'); 
    run; 

試穿好幾年了,我有一個宏變量,我定義爲

%let an=14 
/*It is 14 and not 2014, because elsewhere I need it that way.*/ 

但後來當我試圖把它放在我的程序不會在所有

data want; 
    set have(where="&&20&an."); 
    run; 

工作,我將不勝感激一些幫助

首先編輯:變化d'爲「」,但仍然無法正常工作

第二個編輯,並回答

「20 &的」

+2

宏變量解決雙引號,你可能只需要「20&an」。一部分。 – Reeza 2014-10-08 10:21:18

+0

感謝您的提示,它與「20&an」一起工作。 但是,如果不適用於「&& 20&an」。 我很高興它的工作,但如果你知道爲什麼其他不這樣做,我會高興地採取解釋 – 2014-10-08 10:27:52

+1

&符主要用於解決宏變量。對於20&an,&an解析爲14,所以當與20合併時,您獲得2014. && 20&an變爲&2014,但沒有宏變量2014,這就是爲什麼&& 20&an不起作用。 – Amir 2014-10-08 11:23:55

回答

3

你到達答案(20&an)是正確的 - 你都設置。你甚至不需要閱讀我已發佈的這個答案的其餘部分:-)

但是我注意到你對&&&有點困惑。如果您想了解更多信息,可以在SAS宏觀評估中彙總一些關於&&&之間的差異以及&&的目的的額外信息。

&是最常見的符號 - 您只需使用它來評估/取消引用變量。所以:

%LET an = 14 ; 
%PUT ----- an ; 
%PUT ----- &an ; 

輸出:

----- an 
----- 14 

因此,大家可以看到,你必須把&變量名的前面,以去參考它的價值。省略&只是打印字符串an,在這種情況下恰好是變量的名稱。對於大多數宏編碼,&是你永遠需要的。 &在SAS宏像貝殼,*用C $


現在,什麼是&&呢?它的存在使您能夠擁有動態的宏變量名稱。也就是說,有一個宏變量,其值是另一個宏變量的名稱。如果你熟悉C語言,你可以把它看作是指向指針的指針。

SAS評估&&的方式分兩次進行。在第一遍中,它將&&轉換爲&。同時,它在該通道中看到的任何符號將被用於取消引用它們旁邊的變量名稱。這個想法是爲了將這些後面的表達式解析成一個變量名。然後,在第二遍中,剩餘的&符號(全部爲原始&&符號)將取消引用它們現在發現自己旁邊的任何變量名稱。

這裏是一個示例輸出的例子:

%LET x = 3; 
%LET name_of_variable = x; 

%PUT ----- &x; 
%PUT ----- &&name_of_variable; 
%PUT ----- &&&name_of_variable; 

輸出:

----- 3 
----- x 
----- 3 

在第一%PUT,我們只是使用普通的舊&,因此,我們在做什麼,我們以前那樣,讀取並打印x所保存的值。在第二個%PUT,事情變得更有趣。由於&&,SAS做了兩次評估。第一個轉變是:

%PUT ----- &&name_of_variable; 

對此

%PUT ----- &name_of_variable; 

在第二遍,SAS做標準&評價打印name_of_variable保存的值 - 串x,這恰好是我們正在使用的另一個變量的名稱。當然,這個例子是特別設計的:當你可以寫&name_of_variable時,爲什麼你會寫&&name_of_variable

在第三個%PUT,我們現在有&&&,SAS做了兩遍。這裏是我們最終看到&&真實目的的地方。我將把表達的部分放在圓括號中,以便你可以看到它們是如何評估的。我們從這個去:

%PUT ----- (&&)(&name_of_variable); 

要這樣:

%PUT ----- &x; 

所以在第一遍時,&&轉化爲&,並且&name_of_variable是的name_of_variable一個簡單的去參照,評估到它所持有的內容,正如我們所說的是x

所以在第二次,我們只是留下了簡單的評價:

%PUT ----- &x; 

正如我們所設定x等於3,這個計算結果爲3

因此,在某種意義上說&&&name_of_variable在說「向我顯示名稱存儲在name_of_variable.中的變量的值」

這是您爲什麼要這麼做的一個激勵性示例。假設您有一個簡單的宏子程序,它將一個任意數字添加到存儲在SAS宏變量中的數值中。爲此,子程序必須知道要添加的數量,但更重要的是,它需要知道要添加的變量的名稱。你會通過&&機制實現這種動態的變量命名,比如:

%MACRO increment_by_amount (var_name = , amount =); 
    %LET &var_name = %EVAL (&&&var_name + &amount) ; 
    /* Note: this could also begin with %LET &&var_name = .... */ 
%MEND; 

這裏我們說:「讓他的名字在舉行var_name(即&var_name)等於可變的,其名稱是值的變量持有var_name(即&&&var_name)加上amount(即&amount)中的值。

當您調用像這樣的子程序時,請確保您傳遞變量名稱,而不是值。也就是說,這樣說:

%increment_by_amount (var_name = x , amount = 3); 

不是這個:

%increment_by_amount (var_name = &x , amount = 3); 

所以調用的一個例子是:

%LET x = 3; 
%PUT ----- &x; 
%increment_by_amount (var_name = x , amount = 3); 
%PUT ----- &x; 

輸出:

----- 3 
----- 6 
+1

明天睡覺後我會明天再讀它(對我來說,這一天的結束),但非常感謝! – 2014-10-08 14:06:41

+0

隨時。我聽說你睡着了! – 2014-10-08 14:07:15

+1

非常清楚和有益的thx。 我很高興我的標題是那麼模糊,它可能會讓其他人找到你清晰有用的答案! – 2014-10-09 09:46:23