BookmarkSubscribeRSS Feed
☑ This topic is solved. Need further help from the community? Please sign in and ask a new question.
sskt
Obsidian | Level 7

お世話になっております。

 

データステップやprocステップはrun;で閉じるのが原則だと思っていましたが、書籍やWebページを参照しているとrun;で閉じていなかったり、以下のようにdataステップやprocステップを混ぜ合わせて書いている例を見つけました。
実行してもエラーもWARNINGも出ないようです。
run;を書く書かないでどのような違いがあるか、どういう場合の時にrun;を書かなくても問題なく作動するか、についてお詳しい方、ご教示頂けますと幸いです。

(下のコードだとproc sort data = のデータの指定もないのに動いているのがなぜなのか気になります。)

 

data x;
set x;
by x y z;
proc sort; by x y z;
run;

 

よろしくお願い致します。

1 ACCEPTED SOLUTION

Accepted Solutions
moriokayutaka
Fluorite | Level 6

データステップの始まりである[data]ステートメント,もしくはプロシジャステップの始まりである[proc]を検知すると,暗黙的にその前にrun(quit)をSASが補完して実行してくれてるイメージです
なので,貼っていただいたコードだと多分

data x;
set x;
by x y z;
run;

proc sort; by x y z;
run;

 と解釈されて実行してることになると思います
データステップの中にproc sortなどを入れて,なんだかシームレスに動いてるように見せるのはただの見せかけで,内部では2ステップ実行されているので,推奨できないかなと.
runの省略も同様で,脈々と一部の人が使う息の長い悪習で,基本的には根絶すべき間違いだと思えばいいです(指摘すると喧嘩になりがちですが).

View solution in original post

4 REPLIES 4
PaigeMiller
Diamond | Level 26

It is a good practice to end PROCs and DATA steps with a run; (except that some PROCs should end with a quit;) but as your code shows, it is not always necessary. However, there are situations where SAS can get confused if you don't end the PROC or DATA step properly, so just use the proper end command from now on.

 

PROC および DATA ステップを実行で終了することをお勧めします。 (ただし、いくつかの PROC は終了で終了する必要があります;) しかし、コードが示すように、常に必要というわけではありません。 ただし、PROC または DATA ステップを適切に終了しないと、SAS が混乱する場合があるため、今後は適切な終了コマンドを使用してください。

--
Paige Miller
moriokayutaka
Fluorite | Level 6

データステップの始まりである[data]ステートメント,もしくはプロシジャステップの始まりである[proc]を検知すると,暗黙的にその前にrun(quit)をSASが補完して実行してくれてるイメージです
なので,貼っていただいたコードだと多分

data x;
set x;
by x y z;
run;

proc sort; by x y z;
run;

 と解釈されて実行してることになると思います
データステップの中にproc sortなどを入れて,なんだかシームレスに動いてるように見せるのはただの見せかけで,内部では2ステップ実行されているので,推奨できないかなと.
runの省略も同様で,脈々と一部の人が使う息の長い悪習で,基本的には根絶すべき間違いだと思えばいいです(指摘すると喧嘩になりがちですが).

moriokayutaka
Fluorite | Level 6

あ,追加でごめんなさい proc sortにdata=を指定しないで動く理由も聞かれてるのでした!
これは全部のプロシジャ共通なのですが

proc XXX data= 
のdata=を省略した場合,これも暗黙的にSASが補ってくれていて
data= _LAST_ と同義になります

_LAST_ってなんやねんって話ですが,この_LAST_には自動的に,最後に作られたデータセットが指定されることになります
proc sort data=_LAST_なので,先に説明した通り内部的には2ステップに分かれてますので,1ステップめのデータステップで作られたデータセットが入るわけです.
data=の省略も結構危険な書き方ですが,まあ,データステップの中にいれちゃうことで,その間に予期せぬデータセットが含まれることをなくして,_LAST_を固定していると好意的に解釈できます.


ただ,基本的には,runでステップ書いて明示的にステップを区切り,data=も書いた方がよいです

sskt
Obsidian | Level 7

ご回答いただきありがとうございます。

内部変数の動き等教えていただき非常にわかりやすかったです。

結局data=やrun;は省略せず、基本通りに書くというのが良い、というのがわかりました。

ありがとうございました。