2016年7月1日金曜日

SGPLOTでTEMPLATEプロシジャのコードを自動生成する【TMPLOUT=オプション】





SGPLOTプロシジャに「TMPLOUT=オプション」をつけると、TEMPLATEプロシジャのコードを自動生成してくれます。


  • 自動生成されるコードの出力先を「TMPLOUT=」にtxt形式等でフルパスで指定する。
  • 生成されるコードの中身は環境によって少し異なる。あと後述しますが注意点あり

proc sgplot data=SASHELP.FISH  tmplout="出力先をフルパス指定" ;
      hbox WEIGHT / category=SPECIES;
run;


自動生成されたコード
proc template;
define statgraph sgplot;
dynamic _ticklist_;
begingraph / collation=binary;
layout overlay / yaxisopts=(labelFitPolicy=Split) y2axisopts=(labelFitPolicy=Split) yaxisopts=(discreteOpts=(sortOrder=ascendingFormatted)) yaxisopts=(type=Discrete reverse=true discreteOpts=(tickValueList=_ticklist_ tickValueListPolicy=Union)) y2axisopts=(discreteOpts=(sortOrder=ascendingFormatted)) y2axisopts=(type=Discrete reverse=true discreteOpts=(tickValueList=_ticklist_ tickValueListPolicy=Union));
   BoxPlot X='Species'n Y='Weight'n / primary=true orient=horizontal LegendLabel="Weight" NAME="HBOX";
endlayout;
endgraph;
end;
run;



💬 注意点

例えば、以下のSGPLOTからTEMPLATEプロシジャのコードを自動生成すると、、

proc sgplot data=SASHELP.CLASS  tmplout="出力先をフルパス指定" ;
      vbar SEX;
run;


自動生成されたコード
proc template;
define statgraph sgplot;
dynamic _NEGATIVE_;
dynamic _ticklist_;
begingraph / collation=binary;
layout overlay / yaxisopts=(labelFitPolicy=Split) y2axisopts=(labelFitPolicy=Split) xaxisopts=(type=Discrete discreteOpts=(tickValueList=_ticklist_ tickvaluefitpolicy=SplitRotate tickValueListPolicy=Union)) x2axisopts=(type=Discrete discreteOpts=(tickValueList=_ticklist_ tickvaluefitpolicy=SplitRotate tickValueListPolicy=Union)) yaxisopts=(linearopts=(Integer=true));
   BarChartParm X='Sex'n Y=_FREQUENCY_ / primary=true LegendLabel="度数" NAME="VBAR";
endlayout;
endgraph;
end;
run;


自動生成されたコードの青文字で示した部分に注目!
プロットに使用したデータセット「SASHELP.CLASS」には「_FREQUENCY_」なんて変数はないし、DYNAMICステートメントにも「_FREQUENCY_」なんていうDYNAMIC変数は定義されていません。
ナニコレ??

どうやら、グラフに含まれる要約値(今回の場合は度数)は、自分で計算しないといけない場合があるようです。



例えば今回の場合では、以下のような対応が必要
  • SEXごとの度数をPROC FREQとかで求めてデータセットに出力
  • 自動生成されたコードの「Y=_FREQUENCY_」の部分を「Y=自分で求めた度数が入った変数」に置き換える
  • SGRENDERでは上記で作成したデータセットを使用する



まとめ

SGPLOTでは不可能なカスタマイズをしたい場合にTEMPLATEプロシジャを使いますが、TMPLOUT=オプションでコードを自動生成してしまえば、自分で一から書くより楽な場合があります。

ただし、自動生成なので改行とかインデントつけたりして、見やすくする必要がありますし、
前述したとおり、想定外のコードが生成される場合があるので、ちゃんと中身を確認・理解したうえで適宜カスタマイズする必要があります。


0 件のコメント:

コメントを投稿