捕获错误然后分支逻辑

JD *_*ong 40 error-handling r

如果出现错误情况,如何编写允许我在代码中执行不同路径的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)
Run Code Online (Sandbox Code Playgroud)

pJohnson函数应该失败并出现以下错误:

 Error in pJohnson(0.18, parms) :
 Sb values out of range.
Run Code Online (Sandbox Code Playgroud)

我可以使用以下命令使错误变为静默:

try( pJohnson(.18, parms), silent=T)
Run Code Online (Sandbox Code Playgroud)

但我真正想要做的是执行的功能alternativeFunction(),如果pJohnson(.18, parms)返回错误.

似乎该withCallingHandlers()函数应该帮助我,但我无法弄清楚如何捕获错误并使其alternativeFunction()在错误条件下运行.

Ian*_*ows 45

t <- try(pJohnson(.18, parms))
if("try-error" %in% class(t)) alternativeFunction()
Run Code Online (Sandbox Code Playgroud)

  • `if(inherits(t,"try-error"))alternativeFunction()`是一个不错的选择,比`%in%'更加"对象". (16认同)

Sha*_*ane 15

另一种选择可能是使用tryCatch表达式.这是一个例子:

 vari <- 1
 tryCatch(print("passes"),  error = function(e) print(vari)) # => passes
 tryCatch(stop("fails"),  error = function(e) print(vari)) # => 1
Run Code Online (Sandbox Code Playgroud)

你可以在错误块中做任何你想做的事情,所以在你的情况下,这样的事情应该有效:

tryCatch(pJohnson(.18, parms), error=function(e) alternativeFunction())
Run Code Online (Sandbox Code Playgroud)

这不是错误的预期用法,但它更简洁一些.