我有一个固执的讲师,他坚持要像这样在宏语句的括号内定义所有宏变量
%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;
我认为第二个选项提供了清晰性和简洁的编码结构,有人能指出这两种方法的其他优点或缺点吗?
答案 0 :(得分:4)
两个要点:
答案 1 :(得分:1)
宏观定义:
%macro test(var1 = , var2 = , var3 = 25);
宏调用/执行:
%test(var1 = 5, var2 = 4);
var3在宏中将具有什么值?
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);