if 0 then setにおいて初期化される変数についてはretain効果が付与されている

これは結構、罠なんですが、例えば以下の2つのデータセットがあって

data A;
X=1;output;
X=2;output;
X=3;output;
run;









data B;
Y="Y";Z=111;output;
Y="N";Z=222;output;
run;








の場合

data C;
set A;
if 0 then set B;
if X=1 then Y="Y";
else if X=2 then Y="N";
run;

のように書いた場合、Yという変数はset時のBには存在しない変数で、データステップ中で作成しているわけですが









となって、X=3の時もYがN”になっちゃってます。
これは前のオブザベーションで格納したYが消えずにretainされているからですね

なので、これが問題として、たまに顕在化するのは

data D;
set A;
if 0 then set B;
if _N_=1 then do;
declare hash h1(dataset:'B');
h1.definekey("Y");
h1.definedata("Z");
h1.definedone();
end;
if X=1 then Y="Y";
else if X=2 then Y="N";

if h1.find() ne 0 then call missing(Z);
run;

のように、合成した変数をキーにして、ハッシュ組む場合とかですね









if X=1 then Y="Y";
else if X=2 then Y="N";
if X=1 then Y="Y";
else if X=2 then Y="N";
else Y="";

としてやれば回避できますが、慣れてないとぱっとわかりにくいところですね




0 件のコメント:

コメントを投稿