2016年7月6日水曜日

マクロ言語入門8:マクロ内での条件分岐処理【%IF】




マクロ内で「%IFステートメント」を使って、処理を条件によって分岐させる方法を紹介します




構文


   %IF  条件式  %THEN  %DO;

             条件式がTRUEになった場合の処理

   %END;


・[条件式] がTRUEになった場合に、中のプログラムを実行します。
・マクロの中でのみ利用可能。




例1

%macro TEST( FLG );

   %if &FLG = Y %then %do;
      proc print data=SASHELP.CLASS;
      run;
   %end;

%mend;

%TEST();
%TEST(Y);

マクロ変数FLG に 「Y」 と入っていたらPRINTプロシジャが実行されます。
気をつけたいのがデータステップと勝手が違い、「%if &FLG = "Y"」 というようにダブルクォーテーションで囲う必要はありません。
%IFステートメントではクォーテーションもテキストとして解釈されます。つまり「Y」という文字ではなく「"Y"」という文字として解釈されてしまいます。



例2

%macro TEST( FLG );

   data DT1;
      VAL1 = 1;
      %if &FLG = Y %then %do;
          VAL2=1;
      %end;
   run;

%mend;

%TEST();

 VAL1 
    1  

マクロ変数FLG に 「Y」 と入っていたら変数VAL2を作って「1」を代入するマクロです。
これ実はかなり便利です。なんでかというと、以下のように通常のIF文で同じようなことをやろうとすると、、

%let YN=;

data DT1;
   VAL1 = 1;
   if "&YN"="Y" then do;
      VAL2=1;
   end;
run;

 VAL1 
 VAL2  
    1      .

作りたくないVAL2が出来てしまいます。
これはたとえ実行されない文でもデータステップ内に書かれている変数はまず自動で変数の枠だけ作られてしまうという性質があるからです。

一方、%IFは通常のプログラムとは別のところで動くので、この動きを回避できちゃいます。




IF と %IF の大きな違い

・ IFはデータステップ内で実行するステートメント
・ %IFはデータステップ内とか外とかそういう概念がありません。


つまり%IFでは以下のようにデータセットの中にある変数の値を評価することは出来ません。

X 勘違い注意 X
%macro TEST;

data DT1;
   A=1;
   %if A=1 %then %do;
      B=1;
   %end;
run;

%mend;
%TEST;

%IFでは上記のプログラムを「A」という文字列と「1」という文字列がイコールかどうかを評価しちゃいます。
当然イコールじゃないので中の 「B=1;」 は実行されません。




0 件のコメント:

コメントを投稿