【问题标题】:SAS define %LET macro variable with a double ampersand macro variableSAS 使用双 & 宏变量定义 %LET 宏变量
【发布时间】:2017-10-17 23:27:58
【问题描述】:

我正在尝试使用 %LET 语句创建一个局部宏变量,其值是一个宏变量,需要多个 & 符号来解析。在分配局部宏变量的名称之前,SAS 不会解析多个 &。

%macro example;
%do i=1 %to %sysevalf(&max_n);
    %let dg= &&max_&i..;
    {stuff happens here}
%end;
%mend;
%example;

例如,&max_1。解析为我在代码的 {stuff occur here} 部分中使用的 APPLE。但是,SAS 给了我警告 “警告:未解析明显的符号引用 MAX_。” DG 宏变量返回 &&max_1 到 &&max_17。打电话给&DG。此时将返回 &&max_1 ,它将自行解析为 APPLE,但这不适用于我未显示的代码中的语法。

知道如何制作宏变量以便 &DG.会返回 APPLE 吗?

【问题讨论】:

  • 在其前面添加另一个 &。

标签: sas sas-macro ampersand


【解决方案1】:

(我知道这不是一个答案,但我不能在 cmets 中发布格式化代码。我会在之后编辑/删除这篇文章)

您在此处发布的代码不是您的罪魁祸首。如果我按原样进行,请在前面初始化几个变量并将%put 语句放在stuff happens 的位置:

%let max_1=APPLE;
%let max_n=1;

%macro example;
%do i=1 %to %sysevalf(&max_n);
    %let dg= &&max_&i..;
    %put &dg;
%end;
%mend;
%example;

您可以复制/粘贴并运行它,它会按预期将“APPLE”打印到您的日志中。

您正在尝试做的事情一定有其他原因导致您的问题。

【讨论】:

  • 另外,宏变量直到宏被调用的宏执行时间才被解析(或者不需要存在于父范围或当前范围中)。因此,max_1 和 max_n 的赋值可以发生在宏定义之后和 %example 之前。
  • 对。在这种情况下没有太大区别。
  • 你是对的。我不再收到错误消息。我所做的只是关闭并重新打开 SAS。我不确定是什么搞砸了。我不再收到警告了。
【解决方案2】:

此外,直到调用宏时的宏执行时间才解析宏变量(或不需要存在于父范围或当前范围中)。因此,max_1 和 max_n 的赋值可以发生在宏定义之后和 %example 之前。

您遇到的行为可能是由于您在宏调用之前应用到变量的宏引用。您可以在被调用者范围内的宏中使用 %unquote,在调用者范围内根据宏解析,或确定如何处理您的概念和输入以减少引用量。

注意:数字索引的宏变量有时被称为“宏数组”。以符号为后缀的宏变量有时被称为“宏关联数组”或“宏对象”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    相关资源
    最近更新 更多