【问题标题】:sas how to make all variables in macro local?sas如何使宏中的所有变量都本地化?
【发布时间】:2011-10-24 00:17:34
【问题描述】:

在我的代码中,我在许多级别的其他代码中都有许多宏。大多数宏变量是相同的(日期),但有时我想运行具有不同日期的宏 - 然后我的变量发生冲突。

如何声明将出现在宏中的所有变量都应该是本地变量而不使用 %local 这么多次?对于更深层次的变量的嵌套宏值,会感染上层的变量。

【问题讨论】:

  • 请发布一些示例代码。如果您展示了如何创建宏,可以提供更多建议。

标签: variables macros local sas


【解决方案1】:

您必须每次都使用 %local 明确列出它们。可惜没有捷径。

顺便说一句,如果您在排查嵌套宏时遇到问题,让我更轻松的一个提示是更改我的标准,以便我从不修改任何宏(输入)参数的值。这个简单的概念使调试变得更加容易。

如果您的宏中碰巧有 %include 语句,则添加“选项 source2”,以便这些源代码也显示在日志中。

干杯 抢

【讨论】:

    【解决方案2】:

    另一种选择是将变量定义为宏语句行上的宏参数。下面是一个简单的程序,它创建一个名为 DATE 的全局宏变量,然后定义一个带有参数的宏,该参数也称为 DATE。此外,宏使用不同的日期值 (1) 调用自身。

    options nosource nonotes;
    %let date = '01jan2011'd;
    %put Global DATE = &date;
    
    %******************************************************************************;
    %macro test_macro_level(date=,nest_level=);
    
       %put INSIDE MACRO - Nest Level=&nest_level : DATE=&date;
    
       %if %eval(&nest_level = 1) %then %do;
          %test_macro_level(date='01mar2011'd,nest_level=2);
          %put INSIDE MACRO, AFTER NESTING - Nest Level=&nest_level : DATE=&date;
       %end;
    
    %mend test_macro_level;
    %******************************************************************************;
    %test_macro_level(date='01feb2011'd,nest_level=1);
    
    %put Return to Global: Date=&date;
    

    然后日志文件显示:

    Global DATE = '01jan2011'd
    INSIDE MACRO - Nest Level=1 : DATE='01feb2011'd
    INSIDE MACRO - Nest Level=2 : DATE='01mar2011'd
    INSIDE MACRO, AFTER NESTING - Nest Level=1 : DATE='01feb2011'd
    Return to Global: Date='01jan2011'd
    

    (1) 请注意,迭代宏仅作为示例,绝不应污染您自己的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 2013-01-08
      相关资源
      最近更新 更多