如何定义一个宏变量,其中包含对尚未定义的其他宏变量的引用而不生成警告?
考虑一个为不同变量生成类似图的程序。根据变量,每个数字的标签将会改变。由于除了特定的分析变量之外,所有数字都具有相似的标签,因此将标签放在程序的顶部以便于修改是有意义的。问题是,在程序的那一点上,尚未定义变量名。
例如:
/*Top of program*/
%let label = This &thing gets defined later.;
/* ... */
/*Later in program*/
%let thing = macro variable;
%put &=label;
这会产生所需的输出:
LABEL=This macro variable gets defined later.
但它也会在日志中生成警告:
WARNING: Apparent symbolic reference THING not resolved.
如果我在%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;
输出:
LABEL=This &thing gets defined later.
LABEL=This &thing gets defined later.
有没有办法避免将警告写入日志?
答案 0 :(得分: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);
答案 1 :(得分:0)
只需在数据步骤中使用CALL SYMPUTX()来定义宏变量。
data _null_;
call symputx('label','This &thing gets defined later.');
run;
/*Later in program*/
%let thing = macro variable;
%put &=label;