使用%scan函数时SAS宏变量无法解析的问题排查
SAS宏变量解析问题解决方法
问题原因
你遇到的警告是因为SAS宏处理器的解析规则:当你写&auc_%scan(&models.,&i.)时,宏处理器会优先把&auc_当成一个独立的宏变量名去查找,但这个变量根本不存在,所以抛出"AUC_未解析"的警告。它不会自动把auc_和%scan的结果拼接成完整的宏变量名再解析。
解决方案
有两种简单的方法可以解决这个问题:
方法1:使用双重&&实现间接引用
把%put语句里的&auc_改成&&auc_,利用SAS宏的间接引用规则:&&会先解析后面的宏代码(也就是%scan的结果),再合并成完整的宏变量名。修改后的put_auc宏如下:
%macro put_auc(); %do i = 1 %to %sysfunc(countw(&models.)); %put &&auc_%scan(&models.,&i..); %put &auc_model1.; %end; %mend put_auc; %put_auc;
执行时,&&auc_%scan(&models.,&i..)会先解析%scan得到model1或model2,&&变成&,最终变成&auc_model1.或&auc_model2.,就能正确解析全局宏变量了。
方法2:先定义临时宏变量存储完整变量名
先把要引用的宏变量名拼接好存到临时变量里,再通过间接引用调用,可读性更强:
%macro put_auc(); %do i = 1 %to %sysfunc(countw(&models.)); %let curr_var = auc_%scan(&models.,&i.); %put &&&curr_var.; %put &auc_model1.; %end; %mend put_auc; %put_auc;
这里&&&curr_var.的解析逻辑是:先解析&curr_var.得到auc_model1,然后&&变成&,最终得到&auc_model1.完成解析。
验证效果
修改后重新运行代码,"AUC_未解析"的警告会消失,%put语句能正确输出auc_model1和auc_model2的值(分别为1和2)。
内容的提问来源于stack exchange,提问作者Sarah Deweert
相关产品推荐
相关产品推荐

