頑健なプログラムのための「受け」のテクニック_(REPEMPTY=NO)で空データセットでの上書きをガードする

頑健なプログラム書ける人っています。
シンプルかつ、イレギュラーな値が入っても処理が揺らがない、或いは
直すべき場所がすぐわかるような、しっかりしたコードは憧れます。

将棋で言うなら「受け」の技術って感じですね。


そんな受けのテクニックの一つです。

今、

data A;
 X=1;
run;

data B;
run;

というデータセットがあったとします。

データセット「B」は変数オブザベーションを持たない
全くのnullデータ、クズセットです。

本来はきちんとしたデータセットのはずなのに
何か手違いがあってこうなってしまったと思ってください。

そこで以下のコードを実行すると

data A;
 set B;
run;

当然「A」の中身もなくなります。
仮に「A」が大事なデータセットだとして、
setする「B」が変数とオブザベーションをもった普通のデータセットの時のみ
処理したければ、どうしますか?

マクロ等で、データセットの中身を調べてから分岐してもいいですが、
この場合、もっと、簡単に防御できます。

data A;
 X=1;
run;

data B;
run;


data A(REPEMPTY=NO);
 set B;
run;

とデータセットオプション(REPEMPTY=NO)とすると








「WARNING: REPEMPTY=NO and the replacement file is empty.ため、データセット WORK.A を置き換えていません。」

というログに出て、Aの上書きが拒絶されます。
Aの中身はそのままです。

以下のような場合もどうようです。

proc sort data=A out=A(REPEMPTY=NO);
 where X>5;
 by X;
run;

この書き方も結構使えます。読み込まれたデータがないなどで
解析出力がないは上書きしないみたいなことが実現できます。


まあ、僕はSASも将棋も受けは下手なので、あまり詳しくないですが。

0 件のコメント:

コメントを投稿