宏循环遍历 SAS 中被 ods 破坏的列

Macro looping over columns in SAS broken by ods

我刚刚发现 ods graphics / reset; 打破了我的循环。我仍然很好奇为什么会发生这种情况,以及是否还有其他潜在的类似陷阱。

Objective: 我想遍历 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 ; 

感谢您的宝贵时间。

它并没有打破你的循环,循环是 运行ning,但只保留最后的结果。这是因为当您重置所有选项时图像名称会被重置。

来自 RESET 下的文档:

默认情况下,每次您 运行 一个过程时,都会创建新图像并使用基本名称(例如 SGRender、SGRender1、SGRender2 等)递增编号。 RESET 将重置为没有增量编号的基本名称。如果您多次 运行 PROC 并且只对来自最后 运行 的图像感兴趣(之前的图像将被覆盖),这将很方便。此选项是位置性的,因此它通常排在第一位。

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

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