Macros SAS,使我的宏函数根据输入的变量数有条件
例如,我想为sort函数创建一个宏Macros SAS,使我的宏函数根据输入的变量数有条件,macros,sas,Macros,Sas,例如,我想为sort函数创建一个宏 %MACRO sort(a,via,b); proc sort data=&a out=&b; by &via; run; %MEND; %sort(presort,variable,postsort); 但是如果我想要这个宏,请执行以下代码 proc sort data=presort; by variable; run; 还有打字 %sort(presort,variable); 我怎么能意识到这一点 请注意
%MACRO sort(a,via,b);
proc sort data=&a out=&b;
by &via;
run;
%MEND;
%sort(presort,variable,postsort);
但是如果我想要这个宏,请执行以下代码
proc sort data=presort;
by variable;
run;
还有打字
%sort(presort,variable);
我怎么能意识到这一点
请注意,我使用了三个变量作为第一个变量,两个变量作为第二个变量
谢谢 SAS不支持宏函数的重载。SAS实现这一点的方法是将第三个参数设置为可选
%macro sort(a,via,b=);
proc sort data=&a
%if "&b" ^= "" %then %do;
out=&b
%end;
;
by &via;
run;
%mend;
data test;
do i=1 to 10;
r = rannor(0);
output;
end;
run;
%sort(test,r,b=testout);
%sort(test,r);
不强制在宏定义中使用位置参数。而是使用命名参数。命名参数可以具有默认值
%macro sort(in,byvars,out=&in);
proc sort data=&in out=&out ;
by &byvars ;
run;
%mend sort ;
由于前两个参数是位置参数,因此可以调用它们而无需命名
%sort(presort,var1 var2 var3);
%sort(presort,var1 var2 var3,out=postsort);
但如果你愿意,你也可以直呼其名
%sort(out=postsort,in=presort,byvars=var1 var2 var3)
好问题,但我希望您刚才给出了一个简单的例子,并且您实际上没有考虑为proc sort创建一个“包装器”宏。创建包装宏是一个非常糟糕的主意,因为它们限制了可重用性(您可能无法将它们带到下一个工作中),增加了复杂性而没有显著的收益(除了proc sort已经做的事情之外,它没有做任何事情),使其他人更难阅读您的代码,等等。。。