作为一种编程方法,这通常是可以回答的。
第一条规则:
代码量少时显式使用宏参数。
这意味着,如果你想(说)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);
您如何创建这些可能是程序化的。很大程度上取决于您在做什么以及如何生成代码。有时在你的宏的中间,你生成的值决定了你做的两件事中的哪一个。不过,我仍然会将变化的部分写为单独的宏;然后,您可以添加逻辑来调用适当的宏,并使其更清晰。