宏循环遍历 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 ¤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 ;
感谢您的宝贵时间。
它并没有打破你的循环,循环是 运行ning,但只保留最后的结果。这是因为当您重置所有选项时图像名称会被重置。
来自 RESET 下的文档:
默认情况下,每次您 运行 一个过程时,都会创建新图像并使用基本名称(例如 SGRender、SGRender1、SGRender2 等)递增编号。 RESET 将重置为没有增量编号的基本名称。如果您多次 运行 PROC 并且只对来自最后 运行 的图像感兴趣(之前的图像将被覆盖),这将很方便。此选项是位置性的,因此它通常排在第一位。
您可以为每次迭代指定一个明确的不同 IMAGENAME 以避免这种行为。
我刚刚发现 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 ¤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 ;
感谢您的宝贵时间。
它并没有打破你的循环,循环是 运行ning,但只保留最后的结果。这是因为当您重置所有选项时图像名称会被重置。
来自 RESET 下的文档:
默认情况下,每次您 运行 一个过程时,都会创建新图像并使用基本名称(例如 SGRender、SGRender1、SGRender2 等)递增编号。 RESET 将重置为没有增量编号的基本名称。如果您多次 运行 PROC 并且只对来自最后 运行 的图像感兴趣(之前的图像将被覆盖),这将很方便。此选项是位置性的,因此它通常排在第一位。
您可以为每次迭代指定一个明确的不同 IMAGENAME 以避免这种行为。