web-dev-qa-db-ja.com

Rの「スロー」と同等

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

私はrecoverbrowsetracebackを見ましたが、まあ、それらは近いように見えましたが、私が探しているものではありませんでした。

127
forkandwait

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

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

後で「関連項目」の下で:

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

あなたはおそらくstopが欲しいでしょう。

100

簡単な例:

f <- function(a, b){ 

    if (a == 0){ 
            stop("error message")
    }
 }

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

R.ooパッケージ には、非常に便利なthrow()関数を含む追加の例外処理機能があります。通常の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
Shane

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

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

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

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

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

列が存在するかどうかを確認し、必要な操作を実行できます。
data.frame名前付きdf1および列col1が存在します:

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

または

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

例えば

1
xm1