宏观循环在由ods打破的SAS的专栏

时间:2015-02-19 02:00:30

标签: sas sas-macro

我刚发现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 &currentvalue; 
  %put &i ; 
ods graphics on / width=12.5 in height=12.5in imagemap ;   
title "&currentvalue  &i "; 
proc sgplot data=sashelp.cars;
series x=EngineSize y=&currentvalue ; 
scatter x=EngineSize y=&currentvalue
;run;
ods graphics / reset; 
%end; 
%MEND PLOTYA;

options mprint; 
%plotya ; 

感谢您的时间。

1 个答案:

答案 0 :(得分:4)

它没有打破你的循环,循环正在运行,但只保留了最后的结果。这是因为重置所有选项时会重置映像名称。

来自RESET下的文档:

默认情况下,每次运行过程时,都会使用基本名称(例如SGRender,SGRender1,SGRender2等)逐步创建新图像并对其进行编号。 RESET将重置为基本名称而不带增量编号。如果您多次运行PROC并且仅对上次运行的图像感兴趣(之前的图像将被覆盖),这将非常方便。此选项是位置选项,因此它通常是第一个。

您可以为每次迭代指定一个明确不同的IMAGENAME,以避免此行为。

http://support.sas.com/documentation/cdl/en/grstatug/62464/HTML/default/viewer.htm#p0ewg6cv4t0scfn11pj4x1t8fb04.htm