2010-01-28 6 views
30

¿Cómo escribo el código R que me permite ejecutar una ruta diferente en mi código si ocurre una condición de error? Estoy usando una función que tiende a arrojar un error. Cuando cumple una condición de error, me gustaría ejecutar una función diferente. Aquí hay un ejemplo específico:detectando un error y luego lógica de bifurcación

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) 

la función pJohnson debe fallar con el siguiente error:

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

puedo hacer que el error de ir en silencio mediante el uso de:

try(pJohnson(.18, parms), silent=T) 

pero lo que realmente querer hacer es ejecutar la función alternativeFunction() si pJohnson(.18, parms) devuelve un error.

Parece que la función withCallingHandlers() debería ayudarme, pero no puedo encontrar la manera de capturar el error y ejecutar el alternativeFunction() solo en caso de error.

Respuesta

34
t <- try(pJohnson(.18, parms)) 
if("try-error" %in% class(t)) alternativeFunction() 
+0

claramente un caso de mí que no pienso "suficiente". ¡Gracias por su pronta respuesta! –

+12

'if (hereda (t," try-error ")) alternativeFunction()' es una buena alternativa que es aún más 'objetiva' que el '% in%'. –

+0

Buen punto. La capa de abstracción de objeto para las clases s3 es tan transparente que casi olvido que está allí. –

11

Otra opción podría ser utilizar una expresión tryCatch. He aquí un ejemplo:

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

Puede hacer lo que quiera dentro del bloque de error, por lo que en su caso, algo como esto debería funcionar:

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

Esto no es realmente el uso previsto de la error, pero es un poco más conciso.

Cuestiones relacionadas