web-dev-qa-db-ja.com

エラーをキャッチしてからロジックを分岐する

エラー条件が発生した場合にコード内の別のパスを実行できるようにするRコードをどのように記述しますか?エラーが発生しやすい関数を使用しています。エラー条件を満たした場合、別の機能を実行したいと思います。具体的な例を次に示します。

_require(SuppDists)
parms <- structure(list(gamma = -0.841109044800762, delta = 0.768672140584442, 
    xi = -0.359199299528801, lambda = 0.522761187947026, type = "SB"), .Names = c("gamma", 
"delta", "xi", "lambda", "type"))
pJohnson(.18, parms)
_

pJohnson関数は次のエラーで失敗するはずです。

_ Error in pJohnson(0.18, parms) :
 Sb values out of range.
_

私は次のようにしてエラーを沈黙させることができます:

_try( pJohnson(.18, parms), silent=T)
_

しかし、私が本当にやりたいことは、alternativeFunction()がエラーを返した場合に関数pJohnson(.18, parms)を実行することです。

withCallingHandlers()関数は私に役立つはずですが、エラーをキャプチャーし、エラー状態でのみalternativeFunction()を実行させる方法を理解できません。

41
JD Long
t <- try(pJohnson(.18, parms))
if("try-error" %in% class(t)) alternativeFunction()
48
Ian Fellows

別のオプションは、tryCatch式を使用することです。次に例を示します。

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

あなたはエラーブロック内で好きなことをすることができるので、あなたの場合、このようなものがうまくいくはずです:

tryCatch(pJohnson(.18, parms), error=function(e) alternativeFunction())

これは実際のエラーの使用目的ではありませんが、少し簡潔です。

15
Shane