【问题标题】:SAS: How do I transfer variables between IML statements?SAS:如何在 IML 语句之间传输变量?
【发布时间】:2014-01-08 09:19:24
【问题描述】:

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

%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 not set to a value”。如何告诉 SAS b 是什么,以便我在退出 iml 语句后仍然可以访问它?

【问题讨论】:

    标签: variables macros sas


    【解决方案1】:

    您需要重新设计,使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) 另一种方法是使用SUBMIT and ENDSUBMIT statements 从您的 PROC IML 程序中调用 PROC FREQ:

      /* compute B */
      submit;
      proc freq data=...;
      run;
      endsubmit;
      
      s = sum(b): /* B is still in scope */
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多