Rの「throw」に相当


140

Rでエラーを「スロー」するにはどうすればよいですか?データフレームといくつかの列名を受け取り、それらを処理する関数があります。列が存在しない場合、関数を停止し、それに依存するすべての関数を停止します。

私が見てきたrecoverbrowseしてtracebackも、彼らは私が探しています何近いがないように思われたが、。


2
そう、リカバリ、ブラウザ、トレースバックはデバッグ用であり、try / catchシステムは本番用コードのエラーを処理するためのものです。
ハーラン

20
質問者が質問で複数回探している関数の名前を使用するとき、私はそれが大好きです;)
ハドリー

この質問の回答が上位の回答よりも多いのには理由があると思います。にもかかわらず、この他の質問は、技術的にオフトピックですが、それは、スタックオーバーフローがために有名であることをよく知らない話題の良好タイトな要約のようなものがあります。
Josiah Yoder

回答:


113

を参照してくださいhelp(tryCatch)

状態は「signalCondition」によって示されます。さらに、
' stop'および ' warning'関数は、
条件引数も受け入れるように変更されました。

以降の「関連項目」の下:

stop」と「warning」の信号条件、および「try」は基本的に「tryCatch」の簡易バージョンです。

あなたはおそらく欲しいですstop


24
それは完璧に動作します。Rは奇妙で、独自の欠点はありません。優れたインタープリター型言語の設計に着手するずっと前に設計されました。
forkandwait

5
著者によると、それは古くて良いSchemeの影響を強く受けました。Rは「lispy」ですが、ファンキーなデータ構造を持っています。Rの「興味深い」部分は、多くの規則が他の言語、特に構文的にも近いC言語ファミリと異なることに関連していると考えられます。言語は、開発者が優れたツールを必要とするのではなく、優れたツールを必要とする多くの統計学者によって進化したためだと思います。ただ、「ドット」はちょうどであるという事実は、文字がで取るために長い時間がかかりました。
KarlP

5
ここでのいくつかの基本的な例は、引用だけでなく素晴らしいでしょう。ここstackoverflow.com/a/23917007/54964
レオ・レオポルド・ヘルツ준 영

Rのエラーをsanerエラーメッセージで再スローする方法を検索しながら、トレースをそのままにして(このようtraceback()に、エラーの後に実行して何が問題だったかを確認します)、この質問に行きました。使用stoperrorの引数tryCatchトレースアップ意志混乱。ただし、このfinally引数を使用すると、追加のメッセージをスローすることができ、トレースは有用です。正確にはトピックではありませんが、いくつかのマイナスと、このコメントを窓から追い出す節度の脅威を正当化するのに十分重要であると私は感じています。:-)
マリRemorker


8

ダークが言及している基本機能を超えて:

R.ooパッケージは非常に便利である投()関数を含む追加の例外処理機能を持っています。通常のtryまたはtrycatch関数で例外をキャッチできます。

> try(throw("Division by zero.")); print("It's ok!");
Error: [2009-10-22 10:24:07] Exception: Division by zero.
[1] "It's ok!"

詳しくは、http//www1.maths.lth.se/help/R/R.oo/をご覧ください。


8
へへ。RはOOなしではファンキーではありませんか?反転して申し訳ありませんが、興味深い答えを間違いなくありがとうございますが、上記の単純な古いstop()を使用します。
forkandwait 2009年

1
OOはさらに増えました。:)
イテレータ2011年

3
@ws。Rのファンキーなところは何ですか?plot関数をプロットします。try stop warnすべて期待どおりに機能し、私がやりたいことのほとんどすべてがワンライナーです。
同型

4
多くの場合、「ワンライナーの力」は言語にとって適切な指標ではありません。私たちの多くにとって、可読で理解可能なコードは、より少ない行を切り捨てます。確かに、私は初心者なので、私には理解できないことが多く、それに応じて期待値を調整しようとします。しかし、他の言語では、0から物事を成し遂げるまでかなり直感的です。Rはまた、巧妙で読みにくいワンライナーの文化を発達させたようです。私は、Rubyのように1行であることが多い、英語に似たコードの文化を主張します。
フィリップ

6

実際、この関数stopifnotは、コードに健全性チェックを実装するのに非常に便利です。いくつかの論理式を受け取り、それらのいずれかがfalseと評価された場合はエラーを返します。

例:列 'c'がデータフレーム 'df'に存在するかどうかを確認するには:

df <- data.frame(a = numeric(), b = numeric())
stopifnot(!is.null(df$c))

これにより、次のエラーがスローされます。

Error: !is.null(df$c) is not TRUE

Pythonのようにassert(...)
聞こえ

1

列が存在するかどうかを確認し、必要な操作を実行できます。
仮定data.frameという名前のdf1列があればチェックcol1が存在します:

if(! any(grepl('^col1$',colnames(df1)))) stop("nonexistent column")

または

if(! any(grepl('^col1$',colnames(df1)))) return(-1)

例えば

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.