【问题标题】:SAS CALL SYMPUT not working inside a macro (and before it did)SAS CALL SYMPUT 在宏内不起作用(在它之前)
【发布时间】:2020-04-14 17:48:15
【问题描述】:

我需要将数据集中的行数存储在一个宏变量中。所以我用了这个:

%macro get_table_size(inset,macvar);
 data _null_;
  set &inset NOBS=size;
  call symput("&macvar",size);
 stop;
 run;
%mend;
%get_table_size(LOANTAPE.INSTRUMENT_VU21,NUM_REG_INS);
%put &NUM_REG_INS;

在我的计算机崩溃之前(必须在打开 SAS 的情况下强制它重新启动),这很有效(我发誓 xd)。但是现在,没有创建宏 NUM_REG_INS。日志显示:明显的符号引用 MACVAR 未解析

所以我将代码作为数据步骤而不是宏检查,如下所示:

data _null_;
  set LOANTAPE.INSTRUMENT_VU21 NOBS=size;
  call symput("macvar",size);
 stop;
run;
 %put &macvar

而且它有效。所以问题是在宏中使用此代码时。有谁知道这里会发生什么以及如何解决它?而且,只是为了好奇,为什么它以前可以工作?

谢谢你,真的!!

【问题讨论】:

    标签: sas sas-macro


    【解决方案1】:

    可变范围。考虑使用CALL SYMPUTX() 而不是CALL SYMPUT()。它以前可能有效,因为您在测试时全局创建了宏变量,而在这种情况下您没有。宏变量不存在于宏之外,除非您将它们创建为全局宏变量。

    call symputx("&macvar", size, 'g');
    

    See the documentation here

    【讨论】:

    • 天哪,我不知道用于 symputx,我认为使用 symput 宏变量将被全局存储。非常感谢@Reeza!
    【解决方案2】:

    如果您想在宏之外访问宏变量,请确保它没有被定义为仅对宏本地。您可以使用 call symputX 的第三个参数来强制更新全局宏变量。但是,您可能无法尝试调用此宏来更新调用宏的本地宏变量。

    只需在宏中添加一行,强制宏变量在不存在时为全局变量。您还应该使用较新的 CALL SYMPUTX() 函数,除非您真的想要宏变量值中的前导空格,因为使用较旧的 CALL SYMPUT() 函数会自动将 SIZE 转换为字符串。

    还将 CALL SYMPUTX() 移到 SET 语句之前,这样即使数据集的观测值为零,它也会运行

    %macro get_table_size(inset,macvar);
    %if not %symexist(&macvar) %then %global &macvar;
    data _null_;
      call symputx("&macvar",size);
      set &inset NOBS=size;
      stop;
    run;
    %mend;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 2021-12-18
      • 1970-01-01
      • 2017-08-20
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      相关资源
      最近更新 更多