我輩はブロガーではない。ネタもまだない

SASとかDelphiあたりの人様の役に立たないネタを提供します

PDVの初期化と値保持の仕組み

先日、プログラムデータベクトル(PDV)の込み入った話ということで
意図せず変数の値がretainされている、という内容の記事を書きました。

その後調べたところ、なんと、setステートメントでは、PDVは初期化されていないということを知りました。
PDVが毎回初期化されるのは生データだけだった模様です。知りませんでした。

参考までに、SAS® 9.4 ステートメントリファレンス第 4 版RETAIN ステートメントの項より
f:id:japelin:20201005180504p:plain


おさらいです。
読み込むデータセットが変わるときにだけPDVが初期化される、ということですので、
データセットA、Bを使った次のようなプログラムでは
f:id:japelin:20201005181150p:plain

data c;
  set a b;
  if i=5 then j='55';
run;


こうなります。
f:id:japelin:20201005181229p:plain



では、インターリーブではどうでしょうか。

data d;
  set a b;
  by i;/* インターリーブ読み込み */
  if i=5 then j='55';
run;

「読み込むデータセットが変わるときにだけPDVが初期化される」のでこんな感じになります。
f:id:japelin:20201005181458p:plain

なにか使えるかな…。制御できない(データ依存になる)ので使い所が難しいですね。