在宏函数之外定义宏变量的优点

时间:2018-11-12 11:53:24

标签: sas sas-macro sas-studio

我有一个固执的讲师,他坚持要像这样在宏语句的括号内定义所有宏变量

%MACRO TEST(Var1= , Var2= , Var3= );

这有什么好处?像这样实际定义函数的好处是什么?

%LET var1= <Insert long list of 50 variables here>;
%LET var2= <name of input data>;
%LET var3= <group by variables>;

%MACRO TEST;

我认为第二个选项提供了清晰性和简洁的编码结构,有人能指出这两种方法的其他优点或缺点吗?

4 个答案:

答案 0 :(得分:4)

两个要点:

  • 全局变量的使用是widely considered to be bad practice
  • 使用系统,如何在代码的不同位置写出对同一宏的多个调用?您将如何跟踪哪些参数列表与哪些宏调用相对应?

答案 1 :(得分:1)

  1. 宏变量范围-仅在宏内提供变量可确保不会意外使用任何先前声明的宏变量。如果您不小心使事情混乱,那么使用您的方法很可能会遇到问题。
  2. 可以清楚地知道宏需要哪些参数-否则,您必须阅读代码,找到所有&并在顶部声明它们。
  3. 总体输入较少
  4. 您可以在参数列表中设置默认值,然后仅列出/调用声明时需要的选项。

宏观定义:

%macro test(var1 = , var2 = , var3 = 25);

宏调用/执行:

%test(var1 = 5, var2 = 4);

var3在宏中将具有什么值?

  1. 您仍然使用非常简单的用例,当您有参数时,许多更复杂的用法效果更好。考虑以下情况:对恰好在数据集中的不同参数调用同一宏50次。您可以为每个使用CALL SYMPUTX(),但是随后会遇到调用宏的时间安排问题等。而使用CALL EXECUTE和内联参数则非常容易。

PS。通常,当您刚开始时,您的讲师是正确的几率是99%。假设这将帮助您以不同的方式提出问题,而不是试图证明某人有错(这是您的问题的提出方式),而是要了解事物的工作原理。同样,您的讲师也可能会在线,因此,如果他们在某个时候看到您的问题,您将不会像万事通一样遇到孩子。最终,这是您的选择。

答案 2 :(得分:0)

这取决于宏的使用方式。全局宏可能非常有用,并且如您所指出的那样,如果正确使用它们,则可以提供清晰的信息。例如,如果我有一堆需要运行的SAS程序才能生成数据集或报告,则可以将它们放在包装程序中并使用全局宏。

%Let year = 2019;
%Let State = CA;
%let Dept = DOE;

%macro MakeRpt;

%include "MakeData.sas";
.
. more %include statements
.
%include "GenerateReport.sas";

%mend;

%makeRpt;

但是,如果我要创建一个宏“实用程序”,用户可以在需要时调用它,那么使用本地宏是最有意义的。真正的问题是,如何使用宏来确定全局还是局部更有意义。

答案 3 :(得分:0)

您唯一想做的就是在程序中出现全局变量。例如,拥有特殊的设置或初始化程序来保存通常引用的值并不少见,特别是在开发和生产之间进行时。这样可以在升级程序时使事情更容易处理,或者在以后进行某些更改(例如目录位置或主机名)时更容易进行调整。

例如,下面的宏可以更改某些全局宏变量,以指向某些目录,这两个目录之间的代码取决于运行的位置。

%macro dev_prod;
    %global directory inlib outlib;

    %if(&syshostname. = production-server.company.com) %then %do;
        %let directory = C:\prodlocation;
        %let inlib     = C:\prodlib;
        %let outlib    = C:\outlib;
    %end;
        %else %if(&syshostname. = dev-server.company.com) %then %do;
            %let directory = C:\devlocation;
            %let inlib     = C:\devlib;
            %let outlib    = C:\outlib;
        %end;
%mend;
%dev_prod;

通常,您要在执行特定功能的宏中使用局部宏变量。例如,下面的宏对数据集上的变量进行回归:

%macro regression(data=, dep=, indep=);
    proc reg data=&data.;
        model  &dep. = &indep.;
    run;
%mend;
%regression(data=sashelp.cars, dep=horsepower, indep=msrp);