简化宏定义

时间:2015-11-25 02:35:16

标签: sas sas-macro

所以我创建了一个非常好的宏。在宏观中,我设置观察将开始读取的位置,然后设置它将读取多少观察值。

但是,在我的proc打印电话中,我无法简单地做到:

(firstobs=&start obs=&obs)

因为虽然firstobs会在我想要的地方正确启动,但是obs不合作,因为它必须比firstobs更高的数字。例如,

%testmacro(start=5, obs=3)

不起作用,因为它正在阅读前3个观察结果,但试图从观察开始5.我想要宏做的是,从观察5开始,然后阅读下一个3.所以我做了什么是这样的:

(firstobs=&start obs=%eval((&obs-1)+&start))

当我使用它时,这完全正常。但我只是想知道是否有更简单的方法来做到这一点,而不是必须使用整个%eval ...调用。有没有一个简单的电话,比如numberofobservations = ......?

2 个答案:

答案 0 :(得分:3)

我认为没有。你只能在%eval()内稍微简化你的宏。

%let start=5;
%let obs=3;

data want;
set sashelp.class (firstobs=&start obs=%eval(&obs-1+&start));
run;

此处列出了数据集选项: http://support.sas.com/documentation/cdl/en/ledsoptsref/68025/HTML/default/viewer.htm#p0h5nwbig8mobbn1u0dwtdo0c0a0.htm

您可以使用计数器对数据步骤中的数据进行计数,并仅输出所需的记录,但这对于proc打印不起作用,对于较大的数据步骤效率不高。

您可以尝试使用point =选项,但我不熟悉该方法,而且我认为它不适用于proc print。

答案 1 :(得分:1)

正如@Reeza所说 - 没有一个数据集选项能够满足您的需求。不幸的是,你需要计算结束观察结果,%eval()和其他任何方法一样好。

另外,我建议您的宏参数更灵活。而不是这个:

%testmacro(start=5, obs=3)

将其更改为采用单个参数,该参数将是要应用的数据集选项列表:

%macro testmacro(iDsOptions);
  data want;
    set sashelp.class (&iDsOptions);
  run;
%mend;

%testmacro(firstobs=3 obs=7);

如果您以后需要添加其他选项,这将提供更大的灵活性,这意味着更少的未来代码更改,并且调用宏更简单。你也推迟将这种情况下的观察计数计算到调用程序,这是一件好事。