Rでの例外処理[終了]


97

Rでの例外処理の例/チュートリアルはありますか?公式ドキュメントは非常に簡潔です。


1
これも良い例です:stackoverflow.com/q/12193779/2026975
2013

このブログ投稿が非常に役立つことがわかりました:http
//mazamascience.com/WorkingWithData/

回答:


31

他のStackOverflowディスカッションを指すShaneの回答に加えて、コード検索機能を試すことができます。Googleのコード検索を指すこの元の回答は、その後廃止されましたが、あなたは試すことができます

記録のためだけにありますが、tryそれtryCatchが望ましい場合もあります。Google Code Searchでクイックカウントを試してみましたが、動詞自体の誤検出が多すぎますtryCatchが、より広く使用されているようです。


多分この例が役立つかもしれません:http
//stackoverflow.com/a/12195574/2026975

Githubの検索は、おそらく亡きリンクのためのまともな代替品です。
Gregor Thomas

すべてのリンクが壊れています。
Toros91 2018年

60

基本的にはtryCatch()関数を使いたい。詳細については、help( "tryCatch")を参照してください。

簡単な例を次に示します(エラーが発生した場合は何でも実行できることに注意してください)。

vari <- 1
tryCatch(print("passes"), error = function(e) print(vari), finally=print("finished")) 
tryCatch(stop("fails"), error = function(e) print(vari), finally=print("finished")) 

これらの関連する質問を見てください:



8

関数trycatch()はかなり単純明快であり、それにはたくさんの良いチュートリアルがあります。Rでのエラー処理の優れた説明は、Hadley Wickhamの著書Advanced-Rにあります。次の説明は、非常に基本的な紹介でwithCallingHandlers()ありwithRestarts()、できるだけ短い言葉で説明しています。

低レベルのプログラマが絶対値を計算する関数を書いたとしましょう。彼はそれを計算する方法がわかりませんが、エラーを構築する方法を知っていて、彼の素朴さを熱心に伝えています:

low_level_ABS <- function(x){
    if(x<0){
        #construct an error
        negative_value_error <- structure(
                    # with class `negative_value`
                    class = c("negative_value","error", "condition"),
                    list(message = "Not Sure what to with a negative value",
                         call = sys.call(), 
                         # and include the offending parameter in the error object
                         x=x))
        # raise the error
        stop(negative_value_error)
    }
    cat("Returning from low_level_ABS()\n")
    return(x)
}

中級レベルのプログラマーも絶対値を計算する関数を記述し、途方もなく不完全なlow_level_ABS関数を利用します。彼はnegative_value 、の値xが負の場合に低レベルのコードがエラーをスローすることを知っており、ユーザーがエラーから回復する(またはしない)方法をユーザーが制御できるようにするを確立することにより、問題の解決策を提案します。restartmid_level_ABSmid_level_ABSnegative_value

mid_level_ABS <- function(y){
    abs_y <- withRestarts(low_level_ABS(y), 
                          # establish a restart called 'negative_value'
                          # which returns the negative of it's argument
                          negative_value_restart=function(z){-z}) 
    cat("Returning from mid_level_ABS()\n")
    return(abs_y)
}

最後に、高レベルのプログラマーはmid_level_ABS関数を使用して絶対値を計算し、再起動ハンドラーを使用mid_level_ABSしてnegative_valueエラーから回復するように指示する条件ハンドラーを確立します 。

high_level_ABS <- function(z){
    abs_z <- withCallingHandlers(
            # call this function
            mid_level_ABS(z) ,
            # and if an `error` occurres
            error = function(err){
                # and the `error` is a `negative_value` error
                if(inherits(err,"negative_value")){
                    # invoke the restart called 'negative_value_restart'
                    invokeRestart('negative_value_restart', 
                                     # and invoke it with this parameter
                                     err$x) 
                }else{
                    # otherwise re-raise the error
                    stop(err)
                }
            })
    cat("Returning from high_level_ABS()\n")
    return(abs_z)
}

これらすべてのポイントは、withRestarts()and を使用することwithCallingHandlers()で、関数 high_level_ABSは、の実行を停止せずにmid_level_ABSlow_level_ABSエラーによって発生したエラーから回復する方法を通知できたことですmid_level_ABS。これは、次のことでは実行 できませんtryCatch()

> high_level_ABS(3)
Returning from low_level_ABS()
Returning from mid_level_ABS()
Returning from high_level_ABS()
[1] 3
> high_level_ABS(-3)
Returning from mid_level_ABS()
Returning from high_level_ABS()
[1] 3

実際にlow_level_ABSは、mid_level_ABS呼び出し回数が多い関数(おそらく数百万回)を表します。エラー処理の正しい方法は状況によって異なり、特定のエラーを処理する方法の選択はより高いレベルの関数に任されています(high_level_ABS)。


7

Lispから継承されたRでは、再起動機能が非常に重要です。ループ本体で関数を呼び出したい場合や、関数呼び出しが折りたたまれた場合にプログラムを続行したい場合に便利です。このコードを試してください:

for (i in 1:20) withRestarts(tryCatch(
if((a <- runif(1))>0.5) print(a) else stop(a),
finally = print("loop body finished!")), 
abort = function(){})
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.