Sas 简化宏定义

Sas 简化宏定义,sas,sas-macro,Sas,Sas Macro,所以我创建了一个宏,它工作得非常好。在宏中,我设置了观察开始读取的位置,以及它将读取的观察数量 但是,在我的proc print调用中,我不能简单地执行以下操作: (firstobs=&start obs=&obs) 因为尽管firstobs将正确地从我想要的地方开始,但obs并不配合,因为它必须比firstobs的数字高。比如说, %testmacro(start=5, obs=3) 不起作用,因为它正在读取前3个观察值,但试图从观察值5开始。我想要宏做的是,从观察值5开始

所以我创建了一个宏,它工作得非常好。在宏中,我设置了观察开始读取的位置,以及它将读取的观察数量

但是,在我的proc print调用中,我不能简单地执行以下操作:

(firstobs=&start obs=&obs)
因为尽管firstobs将正确地从我想要的地方开始,但obs并不配合,因为它必须比firstobs的数字高。比如说,

%testmacro(start=5, obs=3)
不起作用,因为它正在读取前3个观察值,但试图从观察值5开始。我想要宏做的是,从观察值5开始,然后读下一个3。所以我所做的是:

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

当我使用它时,它工作得非常好。但我只是想知道是否有一个更简单的方法来做到这一点,而不是必须使用整个%eval。。。呼叫有没有一个简单的电话,比如NumberOfOfOfObservations=…?

我想没有。您只能在%eval()中稍微简化宏

此处列出了数据集选项:

您可以使用计数器来计算数据步骤中的OB,并且只输出所需的记录,但这在诸如proc print之类的程序中不起作用,而且对于较大的数据步骤来说也不高效


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

正如@Reeza所说,没有数据集选项可以满足您的需求。不幸的是,您需要计算结束观察值,
%eval()
是一种很好的方法


另一方面,我建议您使宏参数更灵活。与此相反:

%testmacro(start=5, obs=3)
将其更改为采用单个参数,该参数将是要应用的数据集选项列表:

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

%testmacro(firstobs=3 obs=7);

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

同意这是一种有用的灵活性,因此用户可以添加WHERE=或RENAME=等。另一个选项是使用数据参数,并允许用户指定其中的任何选项。因此,像这样调用:
%testmacro(data=sashelp.class(firstobs=3 obs=7))
。对我来说,这与用户习惯于将数据集传递给数据或过程步骤的方式最为相似。@Quentin Yup这绝对是一个很好的方法。嗯,你会认为有一个数据集选项这么简单。你提到的方法很好,我会尝试一下。
%macro testmacro(iDsOptions);
  data want;
    set sashelp.class (&iDsOptions);
  run;
%mend;

%testmacro(firstobs=3 obs=7);