Rでの例外処理の例/チュートリアルはありますか?公式ドキュメントは非常に簡潔です。
Rでの例外処理の例/チュートリアルはありますか?公式ドキュメントは非常に簡潔です。
回答:
他のStackOverflowディスカッションを指すShaneの回答に加えて、コード検索機能を試すことができます。Googleのコード検索を指すこの元の回答は、その後廃止されましたが、あなたは試すことができます
記録のためだけにありますが、try
それtryCatch
が望ましい場合もあります。Google Code Searchでクイックカウントを試してみましたが、動詞自体の誤検出が多すぎますtryCatch
が、より広く使用されているようです。
基本的には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"))
これらの関連する質問を見てください:
関連するグーグル検索からのこの結果は私を助けました:http : //biocodenv.com/wordpress/?p=15。
for(i in 1:16){
result <- try(nonlinear_modeling(i));
if(class(result) == "try-error") next;
}
関数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
が負の場合に低レベルのコードがエラーをスローすることを知っており、ユーザーがエラーから回復する(またはしない)方法をユーザーが制御できるようにするを確立することにより、問題の解決策を提案します。restart
mid_level_ABS
mid_level_ABS
negative_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_ABS
、low_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
)。