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

时间:2017-05-30 20:25:51

标签: sas

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

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

例如:

/*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.

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

2 个答案:

答案 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;