2016-10-06 189 views
0

此宏字符串比較以神祕的方式爲我工作。對我來說很明顯,%test1(intotest)%test2(intotest)的結果是相等的。sas宏字符串比較不等同於相同的方式

%macro test1(intotest=); 
    %str(&intotest) = %str("b"); 
%mend; 

%macro test2(intotest); 
    %if %str(&intotest) = %str("b") %then 
     1; 
    %else 0; 
%mend EAF; 

data datatable; 
    fromtable = 'b'; 
    test1 = %test1(intotest=fromtable); 
    test2 = %test2(intotest=fromtable); 
run; 

輸出是 fromtable=b,test1=1,test2=0

我將如何改寫%test2(),以便它給出了相同的結果%test1()並仍然使用信息的數據表作爲輸入?

+1

這是一個可怕的宏代碼使用。請不要使用這個。除非這是一項學術活動,否則你真的想做什麼? Proc fcmp用於功能。 – Reeza

+1

'%修補EAF'是什麼意思?我只使用沒有參數的'%mend'或者你想結束的宏的名字。 –

+0

@StigEide「警告:對宏定義TEST1忽略了%MEND語句上的無關文本。」 –

回答

2

SAS語言被設計成處理在數據集(和其它來源)的數據。宏語言旨在處理文本並生成SAS語言代碼。

在第一個示例中,您正在成功使用宏語言生成SAS代碼fromtable = "b";,然後SAS代碼計算(對於每個記錄)數據集變量fromtable的數據值等於文字值b的數據值。順便說一句,你不需要%str()函數。

在第二個示例中,您試圖(希望)使用宏語言來處理存儲在數據步驟變量中的數據。宏語言不處理數據步驟數據。 [有些例外,但我認爲他們不會幫助你理解。]正如所寫,宏語言是將文本字符串fromtable與文本字符串"b"進行比較(請注意,字符串是三個字符長,因爲在宏語言引用標記是價值的一部分)。宏語言不知道有一個名爲fromtable的數據步變量。它甚至不知道有諸如數據步驟,數據集和數據集變量之類的東西。由於文本字符串fromtable不等於文本字符串"b",因此您的宏返回0.

1

您的代碼等於該數據的步驟,運行後的宏:

data datatable; 
    fromtable = 'b'; 
    test1 = fromtable = "b";; 
    test2 = 0; 
run; 
1

第一個宏是生成SAS代碼(包括不需要的額外分號),第二個生成一個單詞,是01。打開MPRINT選項,差異將在SAS日誌中顯而易見。

67   data datatable; 
68    fromtable = 'b'; 
69    test1 = %test1(intotest=fromtable); 
MPRINT(TEST1): fromtable = "b"; 
70    test2 = %test2(intotest=fromtable); 
MPRINT(TEST2): 0 
71   run;