如何基于条件输出运行/不运行SAS或SQL代码?
我有一个带有宏的SAS程序,它将根据输入条件输出不同的变量列表。例如,对于%MACRO(选项1),我得到三个变量,但是对于%MACRO(选项2),我得到四个变量。所有变量的名称都是固定的,但这只是它们是否创建的问题(基于选项) 如何调整宏,以便用户输入的任何选项仍允许宏运行?换句话说,如果某些变量不存在,我如何告诉它忽略它们如何基于条件输出运行/不运行SAS或SQL代码?,sas,sas-macro,proc-sql,Sas,Sas Macro,Proc Sql,我有一个带有宏的SAS程序,它将根据输入条件输出不同的变量列表。例如,对于%MACRO(选项1),我得到三个变量,但是对于%MACRO(选项2),我得到四个变量。所有变量的名称都是固定的,但这只是它们是否创建的问题(基于选项) 如何调整宏,以便用户输入的任何选项仍允许宏运行?换句话说,如果某些变量不存在,我如何告诉它忽略它们 幸运的是,我不局限于任何特定的过程,但它可能必须在数据步骤(宏语言)或PROC SQL语句(where子句或其他一些条件语句)中进行。作为一种编程方法,这在一般情况下是可以
幸运的是,我不局限于任何特定的过程,但它可能必须在数据步骤(宏语言)或PROC SQL语句(where子句或其他一些条件语句)中进行。作为一种编程方法,这在一般情况下是可以回答的 第一条规则: 当代码量较小时,显式使用宏参数。 这意味着,如果您想(比如)对某个对象执行
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);
如何创建这些可能是编程的。很大程度上取决于您正在做什么以及如何生成代码;有时在宏的中间,生成的值决定了你所做的两件事中的哪一件。尽管如此,我仍然会将部分作为单独的宏来编写;然后,您可以添加逻辑来调用相应的宏,并使其更清晰。将宏视为一个黑匣子无法回答此问题。你需要了解宏是如何工作的,如果你还有具体的问题,就发布它们。