2014-10-29 123 views
2

下面是我的宏。變量var1,var2,var3,VR和maxwt不輸入宏,也不在文件中。它們是在宏內計算的中間結果。當我在SAS 9.3執行中,我得到的消息是這樣的:SAS宏中的中間變量

1  var1 = &dcount1 * (&spop1/&refpr1)**2; 
     ---- 
     180 

ERROR 180-322: Statement is not valid or it is used out of proper order. 

宏:

%macro confi (aart,dcount1,dcount2,dcount3,spop1,spop2,spop3,refpr1=0.53468238,refpr2=0.30153350,refpr3=0.16378412); 
    var1 = &dcount1 * (&spop1/&refpr1)**2; 
    var2 = &dcount1 * (&spop2/&refpr2)**2; 
    var3 = &dcount3 * (&spop1/&refpr3)**2; 

    VR = var1+var2+var3; 

    maxwt = max(&refpr1 &refpr2 &refpr3); 

    CI_low = (VR/ 2*&aart)) * cinv(0.025,2*(&aart**2)/VR); 
    CI_high = ((VR + maxwt**2)/(2*(&aart+maxwt)))* cinv(0.975, 2*(&aart+maxwt)**2/(VR + maxwt**2)); 

    %put &aart CI_low CI_high; 

%mend confi; 

%confi (aart=1000, dcount1=20, dcount2=70, dcount3= 10. spop1=3000, spop2=3000, spop3=200); 

回答

1

該宏將有一個數據步內被執行。這些是數據步驟變量和語句,不能在開放代碼中執行。

您也不能使用%put用於此目的 - 您需要使用put

1
  1. 您缺少datastep來計算所有非宏變量。
  2. 當你打電話給一個MACRO執行,這是一個最佳實踐,不要把;在行末。
  3. 在CI_LOW算術運算上,您有不匹配的括號。
  4. 當您調用宏%confi時,您指定的dcount3變量值錯誤,您需要逗號而不是點。
  5. 當你聲明一個宏時,你不在那裏賦值,只聲明變量。
  6. 在最大值函數上,變量需要用逗號分隔。

試試這個:

Options Macrogen Symbolgen; 
%macro confi (aart,dcount1,dcount2,dcount3,spop1,spop2,spop3,refpr1,refpr2,refpr3); 

data _null_; 
var1 = &dcount1 * (&spop1/&refpr1)**2; 
var2 = &dcount1 * (&spop2/&refpr2)**2; 
var3 = &dcount3 * (&spop1/&refpr3)**2; 
VR = var1+var2+var3; 

maxwt = max(&refpr1, &refpr2, &refpr3); 


CI_low = (VR/ 2*&aart) * cinv(0.025,2*(&aart**2)/VR); 
CI_high = ((VR + maxwt**2)/(2*(&aart+maxwt)))* cinv(0.975, 2*(&aart+maxwt)**2/(VR + maxwt**2)); 

put 'low =' CI_low; 
put 'high = ' CI_high; 

run; 

%put &aart; 

%mend confi; 

%confi (aart=1000, dcount1=20, dcount2=70, dcount3= 10, spop1=3000, spop2=3000, spop3=200, refpr1=0.53468238, refpr2=0.30153350, refpr3=0.16378412) 
+0

把一個';'在該行的末尾往往是必要的,以獲得語法高亮正常工作,很遺憾。對於5.,這是不正確的;你可以指定默認值(這聽起來就像這裏所期望的那樣)。對於6.,無論是逗號還是包含''''關鍵字。 – Joe 2014-10-29 20:07:15

+0

對於5,我同意你可以在聲明宏時聲明默認值。那會提出一個問題,那麼宏觀的重點是什麼?爲;在調用MACRO之後,我不確定你的意思是「通常需要讓語法高亮器正常工作」。事實上,官方文件甚至沒有提到需要;換句話說,編譯器忽略了;。 – Salva 2014-10-29 20:47:11

+0

當您有時需要填充值並且有時不需要時,默認值纔有意義。我一直都在使用它們。對於';'位,語法高亮顯示是增強的編輯器或企業指南的一部分,它將關鍵字轉換爲不同的顏色;在宏程序調用對程序不起作用的情況下忽略';',但它有時會導致熒光筆混淆,因此下一個語句可能無法正確突出顯示。 (顯然,在某些情況下,';'是一個問題,在這種情況下,它必須排除在外。) – Joe 2014-10-29 20:55:42