SAS CALL SYMPUT 不能在宏内部工作(在它之前)

SAS CALL SYMPUT not working inside a macro (and before it did)

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

%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

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

谢谢你,真的!!

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

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

See the documentation here

如果您想在宏之外访问宏变量,请确保它没有被定义为仅在宏的本地。您可以使用调用 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;