2017年11月30日木曜日

【SAS QUIZ】第1問:関数を無効にする。




たいした答え用意してるわけじゃないし、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関数を認識できないようにしちゃってます。


他に方法ってあるのかな?
思いついた方いたら、コメントお願いします。


4 件のコメント:

  1. 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;

    返信削除
    返信
    1. ありがとうございます、面白いです!
      複数ステップに分解させて一貫性制約を使う流れ、めちゃくちゃ好きです。

      むしろ問題に縛りを入れ過ぎたので、
      「SUM関数の結果を無効にしてください」と言う条件だけで良いと思ってるので、SASYAMAさんの解法も条件クリアです!

      削除
  2. 返信
    1. なるほど、hashオブジェクトの名前と被っててもエラーでるんですね、面白いです!
      有難う御座います!

      削除