отлов ошибки и затем логика ветвления - PullRequest
39 голосов
/ 29 января 2010

Как мне написать 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() только при условии ошибки.

Ответы [ 2 ]

44 голосов
/ 29 января 2010
t <- try(pJohnson(.18, parms))
if("try-error" %in% class(t)) alternativeFunction()
15 голосов
/ 29 января 2010

Другим вариантом может быть использование выражения 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())

Это на самом деле не предполагаемое использование ошибки, но она более краткая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...