被ods破坏的SAS列上的宏循环

被ods破坏的SAS列上的宏循环,sas,sas-macro,Sas,Sas Macro,我刚刚发现,ods图形/reset打破了我的循环。我仍然很好奇为什么会发生这种情况,以及是否还有其他类似的潜在陷阱 目标: 我想循环SAS中的列,并提供一个x变量保持不变,但y维度变化的绘图。我可以转置并使用by语句。我不想那样做 问题: 尽管日志带有选项mprint显示文本替换工作正常,输出的绘图仅重复显示最终绘图,而不是每个单独的绘图。重复-在日志中,所有内容都正确递增/在输出中,绘图和标题仅显示循环的最后一个值 解决方案: 删除ods图形/复位 下面是一个玩具示例: proc sgplot

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

目标: 我想循环SAS中的列,并提供一个x变量保持不变,但y维度变化的绘图。我可以转置并使用by语句。我不想那样做

问题: 尽管日志带有
选项mprint显示文本替换工作正常,输出的绘图仅重复显示最终绘图,而不是每个单独的绘图。重复-在日志中,所有内容都正确递增/在输出中,绘图和标题仅显示循环的最后一个值

解决方案: 删除
ods图形/复位

下面是一个玩具示例:

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 ; 

谢谢你抽出时间

它没有中断您的循环,循环正在运行,但只保留最后的结果。这是因为当您重置所有选项时,图像名称被重置

从“重置”下的文档中:

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

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


它没有中断循环,循环正在运行,但只保留最后的结果。这是因为当您重置所有选项时,图像名称被重置

从“重置”下的文档中:

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

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


嗯,也许我应该说“破坏了程序”。显示的输出仅仅是最后的结果,这似乎仍然很奇怪。重置发生在sgplot之后。我想这只是因为结果查看器的输出在do循环处理之后。这是正确的:结果查看器只在处理一批代码之后更新。好吧,也许我应该说“破坏了程序”。显示的输出仅仅是最后的结果,这似乎仍然很奇怪。重置发生在sgplot之后。我想只是结果查看器的输出在do循环处理之后,这是正确的:结果查看器只在处理一批代码之后更新。