如何在SAS中依据宏变量值执行步骤?宏变量%IF判断失效求助
SAS宏%IF判断失效的原因及解决方法
核心问题
宏语句(如%IF)属于SAS宏编译/预执行阶段处理的逻辑,而CALL SYMPUT是DATA步运行阶段才会执行的赋值语句。你的代码中,%IF会在DATA步运行前就完成判断,此时flg_copia宏变量还未被赋值(处于空值状态),导致判断条件不成立。另外,宏变量比较时直接写&flg_copia.='Y',当变量为空时会展开成='Y',语法逻辑也存在问题。
解决方法
方法1:用宏函数%LET直接赋值(推荐,适合无需DATA步计算的场景)
如果不需要基于数据集计算赋值,直接用%LET替代CALL SYMPUT,宏变量会在宏执行时立即被赋值,%IF就能正确匹配条件:
%macro carica(periodo0=); /* omissis... */ %let flg_copia=Y; /* 替换原DATA步中的CALL SYMPUT */ %put flag_copia=&flg_copia.; %if &flg_copia. = Y %then %do; data want_&periodo0.; set have; run; %end; %mend; %carica(periodo0=201602);
若宏变量可能包含特殊字符,也可以用引号包裹进行比较:%if "&flg_copia." = "Y" %then %do;
方法2:必须在DATA步中赋值时的处理
如果需要基于数据集逻辑给宏变量赋值,可通过CALL EXECUTE延迟触发宏代码,确保%IF在宏变量赋值完成后再执行:
%macro carica(periodo0=); /* omissis... */ data _null_; /* 此处可添加数据集处理逻辑 */ CALL SYMPUT('flg_copia',"Y") ; /* 动态生成并执行后续宏代码 */ if "&flg_copia." = "Y" then do; call execute('%nrstr(data want_&periodo0.; set have; run;)'); end; run; %put flag_copia=&flg_copia.; %mend; %carica(periodo0=201602);
也可以借助%SYSEVALF函数实现数值/字符的兼容比较:
%macro carica(periodo0=); /* omissis... */ data _null_; CALL SYMPUT('flg_copia',"Y") ; run; %put flag_copia=&flg_copia.; %if %sysevalf(&flg_copia. = Y) %then %do; data want_&periodo0.; set have; run; %end; %mend; %carica(periodo0=201602);
内容的提问来源于stack exchange,提问作者CarLaTeX
相关产品推荐
相关产品推荐

