web-dev-qa-db-ja.com

Rでスクリプトを停止/終了/停止するにはどうすればよいですか?

提供されたデータが正しくない場合、実行を停止するスクリプトを作成しました。ただし、stopはエラーメッセージを生成しますが、スクリプトは続行します。最小限の例:

if (TRUE) {stop("End of script?")} #It should stop here
print("Script did NOT end!") # but it doesn't, because this line is printed!

コンソール出力:

> if (TRUE) {stop("End of script?")}
Error: End of script?
> print("Script did NOT end!")
[1] "Script did NOT end!"
>

これは実際には驚くことではありません。なぜなら?stop

現在の式の実行を停止し、エラーアクションを実行します。

したがって、スクリプトではなく、現在の式のみを終了します。 here スクリプト全体を{}で囲む(または関数に入れる)ことができることがわかりましたが、それは解決策というよりは回避策のようです。もちろん、エラーをキャッチして自分で処理するのは良いプログラミング手法ですが(たとえば、mra68のコメントのリンクを参照)、Rでスクリプトを停止できるかどうかを知りたいです。

returnbreakも試しましたが、これは関数またはループでのみ機能します。 「停止」や「終了」のような他のキーワードを検索しましたが、運はありませんでした。それは非常に基本的な質問のように思えるので、私は少し愚かに感じています。

それで、致命的なエラーでスクリプトを停止/停止/終了できるコマンドはありますか?

Windows 8でR 3.2.3を実行していますが、MAC-OSXのR 3.0.1と同じ問題がありました。

> sessionInfo()
R version 3.2.3 (2015-12-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

locale:
[1] LC_COLLATE=Dutch_Netherlands.1252  LC_CTYPE=Dutch_Netherlands.1252    LC_MONETARY=Dutch_Netherlands.1252
[4] LC_NUMERIC=C                       LC_TIME=Dutch_Netherlands.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] tools_3.2.3

MAC-OSのテスト、sessionInfo()

R version 3.0.1 (2013-05-16)
Platform: x86_64-Apple-darwin10.8.0 (64-bit)

locale:
[1] nl_NL.UTF-8/nl_NL.UTF-8/nl_NL.UTF-8/C/nl_NL.UTF-8/nl_NL.UTF-8
22
RHA

私が知る限り、すべてのプラットフォーム/バージョンでスクリプトを実際に停止するno single commandがあります。これを処理する方法はいくつかあります。

関数または中括弧に入れます:

_{
if (TRUE) {stop("The value is TRUE, so the script must end here")}

print("Script did NOT end!")
}
_

または、エラーを評価し、if else構造のように処理します。

_if (TRUE) {stop("The value is TRUE, so the script must end here")    
  } else { #continue the script
print("Script did NOT end!")   
  }
_

OR(編集):別の可能性は、source("MyScript.R")を使用して、別個の「メイン」R-sciptからスクリプトを呼び出すことです。その後、スクリプトは終了します。ただし、これはコンソールへのエラー以外のすべての出力を抑制します。

または、より複雑な操作の場合は、次のようにtryCatch()を使用します here

9
RHA

多分少し遅すぎるかもしれませんが、最近同じ問題に直面し、私にとって最も簡単な解決策は以下を使用することでした。

quit(save="ask")

?quitから次のことがわかります。

saveは、「no」、「yes」、「ask」、または「default」のいずれかでなければなりません。最初の場合はワークスペースが保存されず、2番目の場合は保存され、3番目の場合はユーザーにプロンプ​​トが表示され、終了しないこともできます。デフォルトでは、対話型での使用を要求しますが、コマンドライン引数(非対話型での使用時に指定する必要があります)によってオーバーライドされる場合があります。

その後、メッセージボックスが表示されたら[キャンセル]をクリックして、Rを終了しないことを決定できます。

お役に立てば幸いです!

7
NonoRbrico