有没有办法可以打印宏生成的SAS代码而不执行它?
由于
答案 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
;;;;
它适用于任何不需要根据其生成的代码结果做出决策的宏。