options mfile mprint; SASマクロによって実際に実行されたコードを、独立した1つのSASファイルとして保存する方法。つまりマクロのデバックや、SASでSASプログラムを作る時に役立つテクニックの話

他人の書いたSASマクロのデバックや修正が大好き!って方はいらっしゃいますか?恐らく、なかなかそんな人はいないはずです。

マクロのデバック法はたくさんあります。 mprint mlogic symbolgen 等等のオプションを使って、ログなんかにマクロやマクロ変数の中身をログに出したりすることが一般的だと思います。

ただ僕は、実際に展開された、平のSASコードを入手して、実際に動かしながら、挙動を確認していくのが一番わかりやすいです。

記憶力と想像力がしょぼいので、ログの情報をもとに、頭の中だけで展開されたコードを再現するのが苦手なんです。

例えば以下の一連のプログラムを見て下さい。
(例なので、極めて簡単なマクロです)

%let M=A;

%macro funclist(pre);
 data DS_⪯
  set sashelp.vfunc;
  where first(fncname)="&pre";
 run;
%mend;

%funclist(&M)


これは、Aから始まるSAS関数を抽出するプログラムです。

%funclist(&M)

によって、実際に実行されるコードは


data DS_A;
set sashelp.vfunc;
where first(fncname)="A";
run;

なわけです。

この実際に実行されるコードを一つのSASプログラムとしてファイル保存したい場合、次のようにかきます。

filename mprint "C:\code.sas";
options mfile mprint;

%let M=A;

%macro funclist(pre);
 data DS_⪯
  set sashelp.vfunc;
  where first(fncname)="&pre";
 run;
%mend;

%funclist(&M)


で実行すると、
Cドライブ直下に「code.sas」というファイルができて、これを開くと









って感じで、見事マクロの展開形が独立したSASファイルになりました。


これは、デバックだけではなく、SASでSASプログラムを動的に作るような処理にも使えます。
putなんかでテキストに打ち込んで作成する方法と違って、
実際にマクロが実行されなきゃ、展開作成されませんけどね。



0 件のコメント:

コメントを投稿