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');
如果您想在宏之外访问宏变量,请确保它没有被定义为仅在宏的本地。您可以使用调用 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;
我需要在宏变量中存储数据集中的行数。所以我用了这个:
%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');
如果您想在宏之外访问宏变量,请确保它没有被定义为仅在宏的本地。您可以使用调用 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;