2015年10月15日木曜日

Graph Template Language(GTL)入門:MVARステートメント【マクロ変数を引数にする】

 


まずは構文をご覧ください。



構文

 PROC TEMPLATE ;
      DEFINE STATGRAPH テンプレート名;
            MVAR    マクロ変数1  マクロ変数2 ・・・ ;
            NMVAR  マクロ変数1  マクロ変数2 ・・・ ;

            ~ グラフテンプレート作成処理 ~
      END;
 RUN;

  • MVAR に指定したマクロ変数は、PROC TEMPLATE内で文字の設定値として参照可能になる。
  • NMVAR に指定したマクロ変数は、PROC TEMPLATE内で数値の設定値として参照可能になる。


例を見ていきましょう。


ステップ1・・・ グラフテンプレートの作成

proc template;
    define statgraph MYGRAPH;
    mvar  m_TITLE m_XVAR m_YVAR;
    nmvar  m_XREF;

    begingraph;
         entrytitle m_TITLE;
         layout overlay;
             scatterplot x=m_XVAR y=m_YVAR;
             referenceline x=m_XREF / curvelabel="特に意味はない参照線";
         endlayout;
    endgraph;
    end;
run;

  • mvar m_TITLE m_XVAR m_YVAR」で、マクロ変数「m_TITLE」~「m_YVAR」を文字の設定値として参照可能にする。
  • nmvar m_XREF」で、マクロ変数「m_XREF」を数値の設定値として参照可能にする。
  • entrytitle m_TITLE」で、グラフのタイトルにマクロ変数「m_TITLE」を設定。
  • scatterplot x=m_XVAR y=m_YVAR」で、散布図のX軸にマクロ変数「m_XVAR」、Y軸にマクロ変数「m_YVAR」を設定。
  • referenceline y=m_XREF」で、X軸の参照線にマクロ変数「m_XREF」を設定。



ステップ2・・・ マクロ変数に値を設定して、グラフ作成実行

%let m_TITLE = 散布図;
%let m_XVAR = AGE;
%let m_YVAR = HEIGHT;
%let m_XREF = 12;

proc sgrender data=SASHELP.CLASS template=MYGRAPH;
run;



  • ステップ1で使用しているマクロ変数「m_TITLE」~「m_XREF」に値を設定。
  • PROC SGRENDERでグラフ作成を実行しています。



覚えておきたいポイント


ポイント1
MVAR/NMVARの細かいルールでミスってうまく動かないことが多いので、リファレンスを参照しつつ、実行後にログや出力結果を確認するようにしましょう。

例えば、以下の青字部分をご覧ください。

proc template ;
    define statgraph MYGRAPH;
        nmvar m_XLIST;
        begingraph;
           layout overlay / xaxisopts=(linearopts=
              (viewmin=0 viewmax=200 tickvaluelist=m_XLIST));
                scatterplot x=WEIGHT y=HEIGHT;
           endlayout;
        endgraph;
    end;
run;

%let m_XLIST = 0 100 200;
proc sgrender data=SASHELP.CLASS template=MYGRAPH;
run;




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

tickvaluelist=(0 100 200)


NMVARでマクロ変数を設定する場合、カッコは不要。

tickvaluelist=m_XLIST


マクロ変数に値を設定する際も、カッコは不要です。

%let m_XLIST = 0 100 200;



ポイント2
データステップ100万回「マクロ変数に数値をいれて戻すと誤差がでちゃう場合がある問題について考える話
で解説されてるように、マクロ変数に小数をいれると切り捨てられる可能性があるのでご注意ください。


ポイント3
本題と逸れますがマクロ変数は「スコープ」というものを理解していないと、落とし穴にはまってしまうことがあります。スコープについては以下記事を参照下さい。

関数
マクロ変数を引数にする
軸の設定

0 件のコメント:

コメントを投稿