我刚发现ods graphics / reset;
打破了我的循环。我仍然很好奇为什么会这样,如果还有其他潜在的类似陷阱。
目标: 我想在SAS中循环列并提供x变量保持不变的图,但y维度不同。我可以转置并使用by语句。我不想那样做。
问题:
尽管options mprint ;
的日志显示文本替换正常工作,但输出的图仅重复显示最终的图,而不是每个单独的图。重复 - 在日志中一切正常递增/在输出中,图和标题只显示循环的最后一个值。
解决方案:
删除ods graphics / reset;
这是一个玩具示例:
proc sgplot data=sashelp.cars;
series x=EngineSize y=Cylinders;
scatter x=EngineSize y=Cylinders;
run;
proc sql ; select distinct NAME
into :varlist separated by ' '
from dictionary.columns
where libname='SASHELP' and memname = 'CARS' AND TYPE='num';
quit;
%let n=&sqlobs;
%MACRO PLOTYA;
%do i= 1 %to &n ;
%let currentvalue = %scan(&varlist, &i);
%put ¤tvalue;
%put &i ;
ods graphics on / width=12.5 in height=12.5in imagemap ;
title "¤tvalue &i ";
proc sgplot data=sashelp.cars;
series x=EngineSize y=¤tvalue ;
scatter x=EngineSize y=¤tvalue
;run;
ods graphics / reset;
%end;
%MEND PLOTYA;
options mprint;
%plotya ;
感谢您的时间。
答案 0 :(得分:4)
它没有打破你的循环,循环正在运行,但只保留了最后的结果。这是因为重置所有选项时会重置映像名称。
来自RESET下的文档:
默认情况下,每次运行过程时,都会使用基本名称(例如SGRender,SGRender1,SGRender2等)逐步创建新图像并对其进行编号。 RESET将重置为基本名称而不带增量编号。如果您多次运行PROC并且仅对上次运行的图像感兴趣(之前的图像将被覆盖),这将非常方便。此选项是位置选项,因此它通常是第一个。
您可以为每次迭代指定一个明确不同的IMAGENAME,以避免此行为。