【SAS】マクロ変数の更新されるタイミング
おそらく、SASマクロ初心者にありがちなミスだと思うのですが、マクロ変数の値が思ったタイミングで更新されなくて悩んでいました。
いろいろ実験した結果、SASのマクロってやっぱりよく分からないという結論に達しました。
DATAステップ内でマクロ変数に代入した直後は、まだ代入されていない
やりたかったこととしては、ループさせて一定時間が経過したらタイムアウトさせるというマクロを組みたかったので、以下の様な感じでコードを書いたのですが、elapsedTimeの値をログ出力させてみると何かがおかしい…
/*マクロ変数の削除と初期化*/ %symdel waitStart elapsedTime / nowarn; %let elapsedTime = 0; %macro wait(); /*wait開始時刻*/ data _null_; datetime = datetime(); call symputx("waitStart", datetime, "G"); put "■Start waiting: " datetime NLDATMM24.; run; /*とりあえず無限ループ*/ %do %while (1); data _null_; /*10秒wait*/ time_slept = sleep(10, 1); /*wait開始からの経過時間*/ datetime = datetime(); elapsed = INT(datetime - &waitStart); call symputx("elapsedTime", elapsed, "G"); put "■Waiting elapsed time: " elapsed; put "マクロ変数elapsedTimeの確認1: &elapsedTime"; run; %put マクロ変数elapsedTimeの確認2: &elapsedTime; %end; %mend; %wait();
そうすると、ログにはこんな感じで出力されます。
■Start waiting: 2015/11/05 10:00:00 ■Waiting elapsed time: 10 マクロ変数elapsedTimeの確認1: 0 マクロ変数elapsedTimeの確認2: 10 ■Waiting elapsed time: 20 マクロ変数elapsedTimeの確認1: 10 マクロ変数elapsedTimeの確認2: 20
おいおい、なんで確認1でずれてるの?と思ったのですが、データステップの外に出ないとマクロ変数は更新されないようですね。
探したらSASのトラブルシューティングに書いてありました。
マクロのトラブルシューティング