Ответ 1
t <- try(pJohnson(.18, parms))
if("try-error" %in% class(t)) alternativeFunction()
Как написать 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()
только при условии ошибки.
t <- try(pJohnson(.18, parms))
if("try-error" %in% class(t)) alternativeFunction()
Другим вариантом может быть использование выражения 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())
На самом деле это не предполагаемое использование ошибки, но оно немного более кратким.