【发布时间】:2015-12-04 08:47:36
【问题描述】:
我想重复一些代码,改变其中一个参数并测试是否满足条件。如果满足条件,我想离开循环,如果不满足,我想继续参数的下一个值。我正在使用下面的代码,它工作正常,只是它不会在我期望的时候离开循环。尽管摘要显示条件应该已经满足,但它似乎总是解析为 False。
%macro set_downward_caps(year, in_year_tolerance, large, small, start, end, increment);
%do c = &start. %to &end. %by &increment.;
%let nominal_down_large_&year. = %sysevalf(&large. + (&c. / 1000));
%let nominal_down_small_&year. = %sysevalf(&small. + (&c. / 100));
%let real_down_large_&year. = %sysevalf((1 - &&nominal_down_large_&year.) * &&rpi&year.);
%let real_down_small_&year. = %sysevalf((1 - &&nominal_down_small_&year.) * &&rpi&year.);
%rates(&year.);
proc means data = output.s_&scenario. noprint nway;
var transbill&year.;
output out = temporary (drop = _type_ _freq_) sum=cost;
run;
data _null_;
set temporary;
call symput('cost', cost);
run;
data temp;
length scenario $ 30;
scenario = "&scenario.";
large = &&real_down_large_&year.;
small = &&real_down_small_&year.;
cost = &cost.;
run;
data output.summary_of_caps;
set output.summary_of_caps temp;
run;
%if %sysfunc(abs(&cost.)) le &in_year_tolerance. %then leave;
%end;
%mend set_downward_caps;
因此 sumary_of_caps 表包含的值表明以下条件应该已解析为真:
%if %sysfunc(abs(&cost.)) le &in_year_tolerance. %then leave;
我尝试将其粘贴在 sysevalf 中,但无济于事。
【问题讨论】:
-
您是否尝试过设置 MPRINT、MLOGIC 和 SYMBOLGEN 选项?这应该有助于确定问题所在
-
Leave 仅用于数据步,不适用于宏。例如,您可以像这样更改它:%if %sysfunc(abs(&cost.)) le &in_year_tolerance。 %then %let c =%eval( &end.+ 1);
-
我打开了 mlogic 和 mprint。也会打开符号生成。
-
谢谢,我会尝试您的建议以取消休假。不幸的是,我今天在家工作,sas 运行缓慢。
-
如果这是一个数据步骤,我建议在循环中添加一个 while 条件。在宏设置中也可以吗?