生成SAS宏代码而不执行它

时间:2017-08-22 14:08:08

标签: sas sas-macro

有没有办法可以打印宏生成的SAS代码而不执行它?

由于

4 个答案:

答案 0 :(得分:2)

有几种方法可以达到你想要的效果,至少在某些时候有效。

您可以设置options obs=0;,然后运行宏(启用MPRINT)。这将运行宏但不会处理任何数据行。这适用于许多宏;但是它会覆盖数据集,所以如果你关心它被保留的内容,它就不安全。

%macro do_something;
  data test;
    set sashelp.class;
  run;
%mend do_something;

options mprint;
options obs=0;

%do_something;

WORK.TEST被覆盖,请注意,但未处理任何观察结果。

现在,如果您正在谈论存储的编译宏(这似乎是最有用的场景,不是吗?),那么它取决于它的存储方式。如果它与/source开关一起存储,那么您可以使用%COPY返回源代码。

libname sasdir "e:\temp"; 
options mstored sasmstore=sasdir; 

%macro do_something/store source;
  data test;
    set sashelp.class;
  run;
%mend do_something;

%copy do_something/source;

它要求使用source标志进行编译。如果它不是,那么除了运行代码之外,源是不可恢复的。

答案 1 :(得分:2)

另一种方法,如果您的宏主要是数据步骤和proc sql,则使用run cancel;proc sql noexec;选项,例如如下:

%macro example(somelogic=1,execute=NO);

  %local cancel noexec;
  %if &execute=NO %then %do;
    %let cancel=cancel;
    %let noexec=noexec;
  %end;

  data some_ds;
    set some_other_ds;
  %if &somelogic %then %do;
    this=that;
  %end;
  run &cancel;

  proc sql &noexec;
  create table maybe as 
    select * from have;

%mend;

通过这种方式,您的代码将被生成/语法检查但不会被执行。

当然 - 这是一个小心谨慎的手柄'因为在宏观环境中仍然可以改变很多事情。 @Chris Long是正确的 - 没有可靠的方法来生成SAS代码而不执行它(因为生成的实际代码通常取决于早期执行的结果)。

答案 2 :(得分:1)

不,不是一般的。宏是一个生成SAS代码的程序,因此知道它将生成什么代码的唯一方法就是运行它。在一些非常简单的情况下,您可能能够解析宏并确定将生成哪些SAS代码,但对于任何更复杂的情况,您必须重新实现一个程序来读取,解析和执行宏为此工作。另请参阅the Halting Problem

答案 3 :(得分:0)

您可以尝试使用PROC STREAM。 让我们定义一个简单的宏

%macro mymacro;
 proc print data=sashelp.class; run;
%mend;

创建一个fileref以包含生成的代码

filename mycode temp;

现在,您可以使用PROC STREAM将宏调用转换为文本。

proc stream outfile=mycode; BEGIN
%mymacro
;;;;

它适用于任何不需要根据其生成的代码结果做出决策的宏。