SAS - 定义包含未定义宏变量的宏变量,而不生成警告

Lor*_*sum 2 sas

如何定义一个宏变量,其中包含对尚未定义的其他宏变量的引用而不生成警告?


考虑一个为不同变量生成类似图的程序.根据变量,每个数字的标签将会改变.由于除了特定的分析变量之外,所有数字都具有相似的标签,因此将标签放在程序的顶部以便于修改是有意义的.问题是,在程序中的那一点,尚未定义变量名.

例如:

/*Top of program*/
%let label = This &thing gets defined later.;

/* ... */

/*Later in program*/
%let thing = macro variable;
%put &=label;
Run Code Online (Sandbox Code Playgroud)

这会产生所需的输出:

LABEL=This macro variable gets defined later.
Run Code Online (Sandbox Code Playgroud)

但它也会在日志中生成警告:

WARNING: Apparent symbolic reference THING not resolved.
Run Code Online (Sandbox Code Playgroud)

如果我把一个%nrstr身边&thing,那么的形式label是正确的(即.LABEL=This &thing gets defined later.)但是,&thing它已被定义后,不再解析.

/*Top of program*/
%let label = This %nrstr(&thing) gets defined later.;
%put &=label;

/* ... */

/*Later in program*/
%let thing = macro variable;
%put &=label;
Run Code Online (Sandbox Code Playgroud)

这输出:

LABEL=This &thing gets defined later.
LABEL=This &thing gets defined later.
Run Code Online (Sandbox Code Playgroud)

有没有办法避免将警告写入日志?

Joe*_*Joe 5

在这里,理解%STR类型引用和%QUOTE类型引用之间的区别是有帮助的.

%QUOTE并且它的变体在宏执行时屏蔽文本,而%STR其变体在宏编译时屏蔽文本.在这种情况下,您关注的是后者,而不是前者,因为您希望&thing在执行期间解决 - 而不是在编译期间.

所以这是%NRSTR救援.您还需要使用%UNQUOTE以使宏变量完全解析 - 即取消NRSTR.

/*Top of program*/
%let label = This %nrstr(&thing.) gets defined later.;

/* ... */

/*Later in program*/
%let thing = macro variable;
%put %unquote(&label);
Run Code Online (Sandbox Code Playgroud)