被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 ¤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 ;
谢谢你抽出时间 它没有中断您的循环,循环正在运行,但只保留最后的结果。这是因为当您重置所有选项时,图像名称被重置
从“重置”下的文档中:
默认情况下,每次运行过程时,都会使用基本名称(如SGRender、SGRender1、SGRender2等)以增量方式创建和编号新图像。重置将重置为基本名称,但不包含增量编号。如果您多次运行一个进程,并且只对上一次运行的图像感兴趣(之前的图像将被覆盖),这将非常方便。此选项是位置性的,因此它通常位于第一位
您可以为每个迭代指定一个明确的不同IMAGENAME以避免这种行为
它没有中断循环,循环正在运行,但只保留最后的结果。这是因为当您重置所有选项时,图像名称被重置
从“重置”下的文档中:
默认情况下,每次运行过程时,都会使用基本名称(如SGRender、SGRender1、SGRender2等)以增量方式创建和编号新图像。重置将重置为基本名称,但不包含增量编号。如果您多次运行一个进程,并且只对上一次运行的图像感兴趣(之前的图像将被覆盖),这将非常方便。此选项是位置性的,因此它通常位于第一位
您可以为每个迭代指定一个明确的不同IMAGENAME以避免这种行为
嗯,也许我应该说“破坏了程序”。显示的输出仅仅是最后的结果,这似乎仍然很奇怪。重置发生在sgplot之后。我想这只是因为结果查看器的输出在do循环处理之后。这是正确的:结果查看器只在处理一批代码之后更新。好吧,也许我应该说“破坏了程序”。显示的输出仅仅是最后的结果,这似乎仍然很奇怪。重置发生在sgplot之后。我想只是结果查看器的输出在do循环处理之后,这是正确的:结果查看器只在处理一批代码之后更新。