DS2のifステートメントの話

DS2のifステートメントが、通常のデータステップでの用法に加えてさらに柔軟な書き方ができるようなので自分用メモ。

proc ds2 libs=work;
data _null_;
declare double a b c;
declare char(10) d;

method init();

/*例1*/
a=1;
b=2;
c = b + (if a < 2 then + a else - a );
put ' ①-1 ' c=;

a=3;
b=2;
c = b + (if a < 2 then + a else - a );
put ' ①-2 ' c=;

/*例2*/
a=4;
b=2;
c= if b ne 0 then a / b else null;
put ' ②-1 ' c=;

a=4;
b=0;
c= if b ne 0 then a / b else null;
put ' ②-2 ' c=;


/*例3*/
a=3;
d = if . < a <= 2 then 'C'
else if 2< a <=3 then 'B'
else if 3 < a then 'A'
else NULL
;

put ' ③-1 ' d=;

a=4;
d = if . < a <= 2 then 'C'
else if 2< a <=3 then 'B'
else if 3 < a then 'A'
else NULL
;
put ' ③-2 ' d=;

/*例4*/
a=1;
b=2;
if a=1 then
if b=2 then put 'メッセージA';
else put 'メッセージB';
else put 'メッセージC';

end;
enddata;
run;
quit;

















例1 c = b + (if a < 2 then + a else - a );

は今までのSASだと
if a < 2 then c= b + a;
else c = b -a;

例2 意味は例1と同じだけど0除算防止はよく使う

例3 これも使えそう、

例4 then doなくていいんだ。すごく違和感だけど通る

注意点として1~3共通だけど、変数=if文って表現やるときは
かならずelseステートメントつけて、文法上でパターンを網羅した形に
しとかないとエラーになるみたい(実際にelseを通ることがありえなかったとしても)


ちなみにselect whenでも同じようにかける
例1なら
c = b + select when(a<2) + a otherwise - a end;
みたいに書ける。

ちなみにちなみにelse ifはelifと書ける。

今回の話とはあんまり関係ないですが
なんかDS2って最早、他のオブジェクト指向の言語で使う表現がすっと通って、旧来のデータステップの表現だとはじかれるイメージ(他言語知らないくせに言うのもアレだけど)があります

他の言語習得してからSASやるのにDS2を介すといいかも。あるいはSASから他言語学ぶのも
DS2をちらっとやってからだとスムーズなのかも。

もしかしたらDS2が普及すると、他言語からの学習コストが一気に下がり、ユーザーも増えて
SASプログラマーの特殊な立ち位置というか、ある種の希少価値や既得権益(笑)がなくなるのかもしれませんね。
若い人とかに「あのオッサン、未だに全部古いデータステップで書いてて、勘弁して欲しいよ」とか言われたらどうしよ。

あんまり宣伝しない方がいいか(笑)

0 件のコメント:

コメントを投稿