SAS:如何在IML语句之间传输变量?

时间:2013-12-19 17:23:01

标签: variables macros sas

假设我正在尝试执行以下操作:

%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语句后仍然可以访问它?

2 个答案:

答案 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会话并清除其内存。