【问题标题】:Macro looping over columns in SAS broken by ods在 SAS 中被 ods 破坏的列上的宏循环
【发布时间】:2015-02-19 02:00:29
【问题描述】:

我刚刚发现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 ; 

感谢您的宝贵时间。

【问题讨论】:

    标签: sas sas-macro


    【解决方案1】:

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

    来自 RESET 下的文档:

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

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

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

    【讨论】:

    • 好吧,也许我应该说'破坏程序'。显示的输出只是最后的结果似乎仍然很奇怪。重置是在 sgplot 之后进行的。我想只是结果查看器的输出是在处理 do 循环之后出现的。
    • 没错:结果查看器仅在处理一批代码结束时更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多