Macros SAS,使我的宏函数根据输入的变量数有条件

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); 我怎么能意识到这一点 请注意

例如,我想为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);
我怎么能意识到这一点

请注意,我使用了三个变量作为第一个变量,两个变量作为第二个变量


谢谢

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已经做的事情之外,它没有做任何事情),使其他人更难阅读您的代码,等等。。。