いただいたご質問への回答:stopステートメント abortステートメントの話

問い合わせ用のフォームからご質問いただいたのですが、返信用のメールアドレスに誤りがあるようで 返事ができませんでした。
記事としてご回答します。

質問の要旨は
=================================================================================
setで新しいデータセットを作る際の処理に
setするデータセット中のある変数に数字の「5」が入っていたら、それ以降の行を読み込むのをやめてエラーをだす方法はありますか?


或いは「5」が入っていたら、強制的にSASを終了させたりもできますでしょうか?=================================================================================

一体、どのようなシチュエーションで必要となった処理なのか、なかなかに興味があります。
うまく意図を汲めているかわかりませんが、以下を考えてみました。

まず

data Q1;
 do X=1,6,8,3,5,4,2,9;
  output;
 end;
run;

のようなデータセットあったとします。












そうしたら

data  A1;
 set Q1;
 if X=5 then do;
  put 'ERROR: やばいです。5がありますよ';
  stop;
 end;
run;

とすれば











とログに出てデータセットの中身は








stopステートメントは、その時点でステップを打ち切ります。
あとはSAS忘備録でも紹介されていた(http://sas-boubi.blogspot.jp/2013/12/blog-post_24.html)
ログにオリジナルエラーメッセージを出す方法を使いました。

あるいは

data A2;
 set Q1;
 if X=5 then abort;
run;

としても












abortや%abortはあまり使ったことないのですが、データセットの中身は同様の結果になります。
ログのエラーメッセージはわかりにくですが...。

さらに強制的にSASそのものを閉じさせたい場合は

/*実行注意!!開いているSASが全部閉じちゃいます*/
 data A3;
  set Q1;
  if X=5 then abort abend;
 run;

 とすればOKのはずです



4 件のコメント:

  1. データステップとプロシジャの間に書いて、処理をストップさせたいことがたまにあるのですが、その場合どう書けば良いかご存知の方がおられましたらお教え下さい(選択部分だけを実行すればいいのですが・・・)。
    それから、コメントに書いたものに修正を加えることができれば助かります(青木先生の「統計学関連なんでもあり」のように)。
    いつもありがとうございます!

    返信削除
    返信
    1. コメント有難うございます!
      う~ん、SASにブレークポイント機能がないという問題ですね。僕も一時期かなり調べたのですが、ばっちりのものは恐らくないです。

      ただ、かろうじて似たようなことを実現する方法としてストップさせたい箇所に
      options obs=0;と書けば、それ以降のコードは、全て0オブザベーション実行になるので構文チェック以外、何も起きません。
      再度、実行したい場合、options obs=max;とすれば通常に戻ります。
      http://sas-tumesas.blogspot.jp/2014/03/optionsobsfirstobs.html

      或いは、プロシジャにcancel オプションをつけるとか
      http://sas-tumesas.blogspot.jp/2014/09/runcancel.html

      外人がよくやるのはコメントアウトの代わりに、止めたい部分以下を、意味のないマクロにする方法
      http://www2.sas.com/proceedings/sugi31/063-31.pdf

      で、%macro skipなどをキーワードで調べれば事例がでてきます。

      SASを一旦そこで落としてしまっていいならendsas;や data _null_;abort abend;run;などで強制終了させれますが、恐らく求められていることと違いますよね。

      ちょっと詳しい人にもあたってみます。

      コメントの修正機能、できるか調べてみます。GoogleのBloggerというサービスを使って、ひな形通りの使い方しかしていなくて、いまいちカスタマイズ法が不明なのです。

      削除
  2. なるほど、自分がなぜその機能が欲しかったのか思い出しました。
    /* コメント*/ を多用している全部分を /* */ でコメント化できないからでした。
    %macro skip を使えばいいですね。
    ありがとうございました。
    「SASプログラミング掲示板」に投稿すれば良かったかな?
    でも、私の投稿で品格を下げてしまいそうで、敷居高いです。

    返信削除
    返信
    1. scdentさん

      とんでもないです!敷居まったく高くないんで、どんなことでも書いてください。

      a matsuさんから、以下の方法をいただきました!

      ①マクロで囲って%IFで分岐するか、%GOTOステートメントでスキップさせたりする

      %macro MAC;

      data DT1;
      run;

      %goto SKIP;

      data DT2;
      run;

      data DT3;
      run;

      %SKIP:

      %mend;
      %MAC;


      ②abort cancelで以降を実行しない
      data a;
      run;

      data _null_;
      abort cancel;
      run;

      data b;
      run;

      data c;
      run;

      ばっちりのものはないとか言っときながらなんですが、abort cancelは、それ以降の処理をしないので、まさにブレークポイントですね

      削除