0

我有一个带有宏的 SAS 程序,该宏将根据输入标准输出不同的变量列表。例如,使用 %MACRO(OPTION1),我得到三个变量,但使用 %MACRO(OPTION2),我得到四个变量。所有变量的名称都是固定的,但这只是是否创建它们的问题(基于选项)。

如何调整宏以使用户输入的任何选项仍允许宏运行?换句话说,如果它们不存在,我怎么能告诉它忽略一些变量

幸运的是,我不限于任何特定的过程,但它可能必须在 DATA 步(宏语言)或 PROC SQL 语句(where 子句或其他一些条件语句)中。

4

1 回答 1

2

作为一种编程方法,这通常是可以回答的。

第一条规则:

代码量少时显式使用宏参数。

这意味着,如果你想(说)PROC MEANS做某事,但变量不同,你可以这样做:

%macro run_means(var=);
  proc means data=sashelp.class;
    var &var.;
  run;
%mend run_means;

%run_means(var=height);
%run_means(var=weight);

等等不要在宏中放置一些条件逻辑,将它们放在外部。这包括变量列表;制作整个变量参数列表。不要将它们写入您的宏中。如果它是一个长列表,请在主程序中将其设为宏变量,然后传递该宏变量。你的宏本身应该努力接受给定的东西;今天你有两组变量,明天你可能有三组,或者一组稍微不同的一组。更改传递给宏的内容比更改宏更容易。

这个概念对于习惯于面向对象编程的人来说会很舒服,尤其是模块化方法,尽管数据的分离有点不同。

第二条规则:

当宏的主要部分因参数而异时,将该代码分成多个宏。

在这种情况下,假设您有两件事要做:运行 PROC MEANS 或运行 PROC FREQ,具体取决于它是字符变量还是数字变量。在这里,我建议不要将所有这些都放在一个宏中的一般规则。这是可能的,但通常这是一个坏主意。添加到前面的宏,如果你想这样做sashelp.class,我会这样做:

%macro run_freq(var=);
  proc freq data=sashelp.class;
    tables &var.;
  run;
%mend run_freq;

%run_means(var=height);
%run_means(var=weight);
%run_freq (var=sex);

您如何创建这些可能是程序化的。很大程度上取决于您在做什么以及如何生成代码。有时在你的宏的中间,你生成的值决定了你做的两件事中的哪一个。不过,我仍然会将变化的部分写为单独的宏;然后,您可以添加逻辑来调用适当的宏,并使其更清晰。

于 2014-10-08T20:31:33.270 回答