2013-12-19 30 views
2

比方說,我想做到以下幾點:SAS:如何在IML語句之間傳輸變量?

%macro test(a=); 
%do i=1 %to &a; 
    proc iml; 
     b=b//(2*i); 
    quit; 
%end; 

proc iml; 
    print sum(b); 
quit; 

%mend; 

%test(a=2); 

在我試圖寫的代碼,我不能把它全部在一個IML(我需要do循環中的PROC頻率)。上面的代碼給出了錯誤「矩陣b未設置爲值」。我如何告訴SAS b是什麼,以便在我退出iml語句後仍可以訪問它?

回答

0

您需要重做東西,以便PROC IML;QUIT;不在宏之外。即使在其他並不重要的情況下,這也是很好的做法,但這是必要的。

IE

%macro test(a=); 
%do i=1 %to &a; 
     b=b//(2*i); 
%end; 

proc iml; 
%test(a=5); 
quit; 

QUIT結束PROC IML會話,並且清除其存儲器。

2

兩個建議:

1)使用STORE statement在第一呼叫結束寫矩陣B到磁盤,然後使用LOAD statement第二呼叫期間讀它在:

store B; 
quit; 

proc freq data=...; 
run; 

proc iml; 
load B; 
... 

2)另一種方法是從PROC IML程序中通過使用以下代碼調用PROC FREQ:SUBMIT and ENDSUBMIT statements

/* compute B */ 
submit; 
proc freq data=...; 
run; 
endsubmit; 

s = sum(b): /* B is still in scope */