2017-05-30 118 views
2

如何定义一个宏变量,该变量包含对尚未定义的其他宏变量的引用而不生成警告?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. 

是否有某种方式来避免写警告日志?

回答

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); 
0

只需在数据步骤中使用CALL SYMPUTX()来定义宏变量。

data _null_; 
    call symputx('label','This &thing gets defined later.'); 
run; 
/*Later in program*/ 
%let thing = macro variable; 
%put &=label;