如何基于条件输出运行/不运行SAS或SQL代码?

时间:2014-10-08 19:51:59

标签: sas sas-macro proc-sql

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

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

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

1 个答案:

答案 0 :(得分: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);

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