设置默认宏参数SAS 9.2时出错

设置默认宏参数SAS 9.2时出错,sas,Sas,我正在尝试为宏参数设置默认变量。我在一个网站上发现了这个例子: %macro myprint (var1, var2=t); PROC PRINT data = &var1..&var2; Run; %mend myprint; /* Macro Call */ %myprint (store,) 但当我尝试运行它时,我得到了一个错误:找到的位置参数比定义的多 我正在使用SAS 9.2。我必须做些不同的事情吗?SAS宏中有两种参

我正在尝试为宏参数设置默认变量。我在一个网站上发现了这个例子:

%macro myprint (var1, var2=t);
            PROC PRINT data = &var1..&var2;
            Run;
%mend myprint;

/* Macro Call */
%myprint (store,)
但当我尝试运行它时,我得到了一个错误:找到的位置参数比定义的多


我正在使用SAS 9.2。我必须做些不同的事情吗?

SAS宏中有两种参数:位置参数和命名参数。可以将它们混合在一起,尽管一般来说这是个坏主意

命名参数类似于您的
var2=t
。它们必须在调用中通过名称显式指定。这实际上在很多时候是一种“最佳实践”;它确保您定义了正确的参数(忘记宏中参数的顺序有多容易?。
命名参数可以按任何顺序使用,也可以不使用(无论它们是否具有默认值)。比如说,

%macro myprint(var1=,var2=t);
...
%mend;
这将为var2设置默认值,但不会为var1设置默认值;它仍然必须被提供,或者它将被评估为空白(这可能是可以的,也可能不是)

位置参数与它们听起来完全一样:由宏定义中的位置定义的参数。它们必须按顺序提供(当然),如果不提供,则默认为空。不能为它们提供默认值。位置参数必须在命名参数之前-即,您不可能这样做

%macro myprint(var2=t,var1);
因为那样会把事情搞得一团糟


因此,在您的情况下,如果您想保持名为1的1的位置,只需在不提供
var2

宏调用需要两个参数时删除额外的“.”<代码>%myprint(var1=store,var2=t)我还建议在宏定义后添加分号并删除var2声明<代码>%myprint宏(var1,var2)另外,如果var2总是't',那么为什么要将其作为一个参数?@scott,这只是一个默认值-当
var2
未提供给宏调用时(这是允许的)。哇,很好的解释!这使事情变得明朗了许多。