2010-01-28 20 views
30

如何編寫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()

回答

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

明顯是我沒有想到「對象」足夠的情況。感謝您的快速響應! – 2010-01-28 23:45:19

+12

'if(inherits(t,「try-error」))alternativeFunction()'是一個不錯的選擇,它比'%in%'更加'對象'。 – 2010-01-28 23:55:12

+0

好點。 s3類的對象抽象層非常透明,我幾乎忘記它在那裏。 – 2010-01-29 06:44:20

11

另一種選擇可能是使用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()) 

這不是真正的使用目的錯誤,但它更簡潔一些。