たいした答え用意してるわけじゃないし、SASマスターにとっては簡単なクイズかも。
問題
以下「???」にプログラムを追加することによって、SUM関数の結果をERRORにさせて、データステップを中止させて下さい。
data TEST;
???
Y = sum(1,2,3);
run;
|
回答例
↓
↓
↓
↓
↓
↓
↓
↓
私の思いつく正解としては、「ARRAYを使う」です。
以下をご覧ください。
data TEST;
array sum(1) _temporary_;
Y = sum(1,2,3);
run;
ログ
NOTE: 配列sumの名前がSAS提供またはユーザー定義関数の名前と同一です。この名前の後ろのかっこは、関数の参照ではなく、
配列の参照として処理されます。
ERROR: 配列sumに指定した添字の数が多すぎます。
NOTE: エラーが発生したため、このステップの処理を中止しました。
|
(ARRAYの構文は例なので適当です、やりたい事が出来ていればOK)
ログに出てるメッセージの通り、sumという配列を定義しちゃって、sum関数を認識できないようにしちゃってます。
他に方法ってあるのかな?
思いついた方いたら、コメントお願いします。
ARRAYを使うに思い至った後、ずっと他の方法を考えてました。
返信削除問題文から???の部分に挿入するコードに制限がないのと、1ステップでやれとは言っていないので、以下のようにすれば、_ERROR_=1がたって、sum関数の結果がエラー(正確には更新処理がエラーだけど)になります。しかし、「データステップを中止させて下さい。」という条件がクリアできませんでした。
無念です。
data TEST;
/*ここから*/
call missing(Y);
run;
proc datasets ;
modify TEST;
ic create Y = check(where=(Y<=5));
run;
data TEST;
modify TEST;
/*ここまで???に挿入*/
Y = sum(1,2,3);
run;
ありがとうございます、面白いです!
削除複数ステップに分解させて一貫性制約を使う流れ、めちゃくちゃ好きです。
むしろ問題に縛りを入れ過ぎたので、
「SUM関数の結果を無効にしてください」と言う条件だけで良いと思ってるので、SASYAMAさんの解法も条件クリアです!
declare hash Y ;
返信削除なるほど、hashオブジェクトの名前と被っててもエラーでるんですね、面白いです!
削除有難う御座います!