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

Sas 在宏函数之外定义宏变量的优点,sas,sas-macro,sas-studio,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; %LET

我有一位固执的讲师,他坚持在宏语句的括号内定义所有宏变量,如下所示

%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;
%LET var1=;
%设var2=;
%设var3=;
%宏观测试;
我认为第二种选择提供了清晰和整洁的编码结构,有人能指出这两种方法的其他优点或缺点吗?

两个要点:

  • 全局变量的使用是非常重要的
  • 使用您的系统,如何在代码的不同位置编写对同一宏的多个调用?如何跟踪哪些参数列表对应于哪些宏调用
    • 两个要点:

      • 全局变量的使用是非常重要的
      • 使用您的系统,如何在代码的不同位置编写对同一宏的多个调用?如何跟踪哪些参数列表对应于哪些宏调用

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

      %Let year = 2019;
      %Let State = CA;
      %let Dept = DOE;
      
      %macro MakeRpt;
      
      %include "MakeData.sas";
      .
      . more %include statements
      .
      %include "GenerateReport.sas";
      
      %mend;
      
      %makeRpt;
      

      但是,如果我正在制作一个宏“实用程序”,用户需要时可以调用它,那么使用本地宏最有意义。这实际上是一个如何使用宏的问题,即全局还是局部更有意义。

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

      %Let year = 2019;
      %Let State = CA;
      %let Dept = DOE;
      
      %macro MakeRpt;
      
      %include "MakeData.sas";
      .
      . more %include statements
      .
      %include "GenerateReport.sas";
      
      %mend;
      
      %makeRpt;
      
      但是,如果我正在制作一个宏“实用程序”,用户需要时可以调用它,那么使用本地宏最有意义。这实际上是一个如何使用宏的问题,即全局还是局部更有意义

    • 宏变量范围-使变量仅在宏中可用可确保先前声明的任何宏变量不会意外使用。如果你不小心把事情搞砸了,用你的方法你很可能会遇到问题
    • 它清楚地说明了宏需要哪些参数,否则您必须阅读代码,找到所有参数&并在顶部声明它们
    • 总的来说打字更少
    • 您可以在参数列表中设置默认值,然后仅列出/调用声明时所需的选项 宏定义:

      %macro test(var1 = , var2 = , var3 = 25);
      
      宏调用/执行:

      %test(var1 = 5, var2 = 4);
      
      var3在宏中有什么值?

    • 您仍然在使用非常简单的用例,当您有参数时,许多更复杂的用法工作得更好。考虑对相同的宏调用50次,用于发生在数据集中的不同参数。您可以对每个宏使用CALL SYMPUTX(),但随后会遇到调用宏的时间等问题。而使用callexecute和内联参数则非常简单 附言:一般来说,当你开始学习的时候,99%的几率你的讲师是正确的。假设这有助于你以不同的方式构建你的问题,而不是试图证明某人错了(这就是你的问题的来龙去脉),那么你将着眼于理解事情是如何运作的。此外,你的讲师也可能在线,因此如果他们在某个时候看到你的问题,你不会被认为是一个无所不知的孩子。但最终这是你的选择

    • 宏变量范围-使变量仅在宏中可用可确保先前声明的任何宏变量不会意外使用。如果你不小心把事情搞砸了,用你的方法你很可能会遇到问题
    • 它清楚地说明了宏需要哪些参数,否则您必须阅读代码,找到所有参数&并在顶部声明它们
    • 总的来说打字更少
    • 您可以在参数列表中设置默认值,然后仅列出/调用声明时所需的选项 宏定义:

      %macro test(var1 = , var2 = , var3 = 25);
      
      宏调用/执行:

      %test(var1 = 5, var2 = 4);
      
      var3在宏中有什么值?

    • 您仍然在使用非常简单的用例,当您有参数时,许多更复杂的用法工作得更好。考虑对相同的宏调用50次,用于发生在数据集中的不同参数。您可以对每个宏使用CALL SYMPUTX(),但随后会遇到调用宏的时间等问题。而使用callexecute和内联参数则非常简单
      附言:一般来说,当你开始学习的时候,99%的几率你的讲师是正确的。假设这有助于你以不同的方式构建你的问题,而不是试图证明某人错了(这就是你的问题的来龙去脉),那么你将着眼于理解事情是如何运作的。此外,你的讲师也可能在线,因此如果他们在某个时候看到你的问题,你不会被认为是一个无所不知的孩子。但最终这是你的选择

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

      例如,下面的宏可以更改一些全局宏变量以指向特定的目录