假设我正在尝试执行以下操作:
%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 freq)。上面的代码给出了错误“Matrix b未设置为值”。我如何告诉SAS什么是b,以便在我退出iml语句后仍然可以访问它?
答案 0 :(得分:2)
两个建议:
1)在第一次通话结束时使用STORE statement将矩阵B写入磁盘,然后在第二次通话期间使用LOAD statement将其读入:
store B;
quit;
proc freq data=...;
run;
proc iml;
load B;
...
2)另一种方法是使用SUBMIT and ENDSUBMIT statements从PROC IML程序中调用PROC FREQ:
/* compute B */
submit;
proc freq data=...;
run;
endsubmit;
s = sum(b): /* B is still in scope */
答案 1 :(得分: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会话并清除其内存。