2018年2月15日木曜日

「ODS OUTPUT」の落とし穴




以下のプログラム、WARNINGが出ちゃいますが、どこがおかしいか分かりますか?


proc glm data=sashelp.class;
   class sex;
   model height = sex;
run;

ods output Summary=OUT1;
proc means data=sashelp.class;
   var height;
run;
ods output close;


ログ
WARNING: 出力'Summary'は作成されていません。出力オブジェクト名、ラベル、パスが正しく記述されているかを確認してください。また、要求した出力オブジェクトを作成するために、
         適切なプロシジャオプションが使われているかも確認してください。たとえば、NOPRINTオプションが使われていないことを確認してください。
WARNING: プロシジャステートメントの終わりを検出したので、現在のODS SELECT/EXCLUDE/OUTPUTステートメントをクリアしました。
         対話型プロシジャ(終了するにはquit;をタイプします)が終了していないかもしれません。



この落とし穴にはまってる人たまに見かけます。


これは対話型プロシジャを使う場合に起こる落とし穴です。
(対話型プロシジャについては、「RUNとQUITの違い」をご覧ください。)


今回の例で使用しているGLMプロシジャは対話型プロシジャです。
「QUIT」と書くか、別のDATAステップ・PROCステップが現れるまで、GLMプロシジャは起動したままになります。
なので、以下の青文字部分がGLMプロシジャに対する処理だと判断されてしまいます。


proc glm data=sashelp.class;
   class sex;
   model height = sex;
run;

ods output Summary=OUT1;
proc means data=sashelp.class;
   var height;
run;
ods output close;



解決方法はご存じの通り、「quit;」を入れるだけです。

proc glm data=sashelp.class;
   class sex;
   model height = sex;
run;
quit;

ods output Summary=OUT1;
proc means data=sashelp.class;
   var height;
run;
ods output close;




そもそもSASのマニュアルにも対話型プロシジャにQUITを入れていない例があるので、
この問題に気づかなくても無理はないっちゃないんですが。。


ちなみに、今回紹介した落とし穴は「ods output」だけでなく、「ods select」「ods exclude」とかでも同様に起こる問題です。

0 件のコメント:

コメントを投稿