2015-02-19 2 views
0

Я только что обнаружил, что ods graphics/reset; сломал мой цикл. Мне все еще интересно, почему это произошло, и если есть другие потенциальные подобные подводные камни.Макросъемка по столбцам в SAS, разбитая ods

Цель: Я хочу перебрать столбцы в SAS и предоставить график, в котором переменная x остается постоянной, но размерность y варьируется. Я мог бы транспонировать и использовать оператор by 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 ; 

Спасибо за ваше время.

ответ

4

Это не нарушение цикла, цикл работает, но сохраняются только последние результаты. Это связано с тем, что имя изображения сбрасывается при сбросе всех параметров.

Из документации по СБРОСУ:

По умолчанию, каждый раз, когда вы запускаете процедуру, новые изображения создаются и нумеруются с приращением, используя базовое имя, например, SGRender, SGRender1, SGRender2, и так далее. RESET сбрасывается на базовое имя без номера инкремента. Это удобно, если вы запускаете PROC несколько раз и интересуетесь только изображениями с последнего запуска (предыдущие будут перезаписаны). Этот параметр является позиционным, поэтому он обычно на первом месте.

Вы можете указать явный другой IMAGENAME для каждой итерации, чтобы избежать такого поведения.

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

+0

Ну, возможно, я должен был сказать "сломал программу. По-прежнему кажется странным, что отображаемый результат был только последним результатом. Сброс произошел после sgplot. Я полагаю, что только вывод в средство просмотра результатов происходит после обработки цикла do. –

+1

Верно: просмотр результатов обновляется только в конце обработки одной партии кода. – Joe