2015年9月7日月曜日

Graph Template Language(GTL)入門:DYNAMICステートメント【引数の設定】


DYNAMICステートメントを使うと、マクロや関数みたいに引数を設定できます。


構文


PROC TEMPLATE;
    DEFINE STATGRAPH  テンプレート名;
              DYNAMIC  ダイナミック変数1  ダイナミック変数2 ・・・ ;

              ~ ここにダイナミック変数を使ってグラフを作成する文を書く ~
    END;
RUN;



PROC SGRENDER  DATA=プロットするデータセット  TEMPLATE=テンプレート名;
    DYNAMIC  ダイナミック変数1=設定値  ダイナミック変数2=設定値 ・・・; 
RUN;


構文だけだとよく分かんないので例を見てみましょう。

(ちなみに「ダイナミック変数の設定値に対して、クォーテーションをつけるか否か」が間違えやすいです。その点も記事の最後に解説してるのでご参照下さい)





* グラフテンプレート作成 ;
proc template ;
    define statgraph MYGRAPH;
        dynamic _XVAR _YVAR;
        begingraph ;
           layout overlay ;
               scatterplot  x=_XVAR  y=_YVAR;
           endlayout;
        endgraph;
    end;
run;

* グラフ作成実行 ;
proc sgrender data=SASHELP.CLASS template=MYGRAPH;
    dynamic  _XVAR="WEIGHT"  _YVAR="HEIGHT";
run;



解説

proc template ;
    define statgraph MYGRAPH;
        dynamic _XVAR _YVAR;

① まずはTEMPLATEプロシジャにて「dynamic _XVAR _YVAR;」で 「_XVAR」「_YVAR」 というダイナミック変数を定義。


        begingraph ;
           layout overlay ;
               scatterplot  x=_XVAR  y=_YVAR;
           endlayout;
        endgraph;
    end;
run;

② 「scatterplot  x=_XVAR  y=_YVAR;」で、X軸とY軸を①で定義したダイナミック変数で仮設定しておく。


proc sgrender data=SASHELP.CLASS template=MYGRAPH;
    dynamic  _XVAR="WEIGHT"  _YVAR="HEIGHT";
run;

③ SGRENDERでグラフ作成を実行する際に、「dynamic _XVAR="WEIGHT" _YVAR="HEIGHT";」でTEMPLATEプロシジャ内の、
  • ダイナミック変数「_XVAR」を「WEIGHT」に、
  • ダイナミック変数「_YVAR」を「HEIGHT」に設定して実行します。



利点

以下のように、ダイナミック変数の設定値を変えて再度実行する事が出来るので、汎用性が高いTEMPLATEが作れます。

proc sgrender data=SASHELP.CLASS template=MYGRAPH;
    dynamic  _XVAR="AGE"  _YVAR="HEIGHT";
run;




覚えておきたいポイント


ポイント1

「ダイナミック変数」と「PLOTに使用するデータセットの変数」の名前が被らないようにご注意下さい。挙動がおかしくなります。



ポイント2

「ダイナミック変数の設定値に対して、クォーテーションをつけるか否か」のルールとして、
  • 変数名や文字に対してはクォーテーションをつける
  • 数値の場合、
    • 「10」のように数値1個だけの設定値の場合はクォーテーションをつけない
    • 「10 20 30」のような数値を列挙するような設定値の場合はクォーテーションをつける

以下、上のルールを適用した例

* グラフテンプレート作成 ;
proc template ;
    define statgraph MYGRAPH;
        dynamic _ETITLE _XMIN _XMAX _XLIST _XVAR _YVAR;
        begingraph ;
           entrytitle _ETITLE;
           layout overlay / xaxisopts=(linearopts=(
                                        viewmin=_XMIN viewmax=_XMAX tickvaluelist=_XLIST));
                scatterplot  x=_XVAR  y=_YVAR;
           endlayout;
        endgraph;
    end;
run;

* グラフ作成実行 ;
proc sgrender data=SASHELP.CLASS template=MYGRAPH;
    dynamic _ETITLE = "散布図"
                 _XMIN = 0
                 _XMAX = 200
                 _XLIST = "0 100 200"
                 _XVAR = "WEIGHT"
                 _YVAR = "HEIGHT";
run;


特に「TICKVALUELIST」に注目!
PROC TEMPLATEでは通常、以下のようにカッコで囲って数値を列挙しますが、

tickvaluelist=(0 100 200)


ダイナミック変数を使う場合、カッコは不要

tickvaluelist=_XLIST


また、PROC SGRENDERでダイナミック変数に設定する値はクォーテーションで囲ってあげないと認識してくれません。

_XLIST="0 100 200"


このように「カッコをつけるか否か」や「クォーテーションをつけるか否か」など、細かいルールでミスってうまく動かないことが多いので、リファレンスを参照しつつ、実行後にログや出力結果を確認するようにしましょう。


引数の設定

0 件のコメント:

コメントを投稿