2010-01-28 47 views
30

Làm cách nào để viết mã R cho phép tôi thực thi một đường dẫn khác trong mã của tôi nếu xảy ra tình trạng lỗi? Tôi đang sử dụng một chức năng có xu hướng ném một lỗi. Khi nó đáp ứng một điều kiện lỗi, tôi muốn thực hiện một chức năng khác. Dưới đây là một ví dụ cụ thể:bắt lỗi và sau đó phân nhánh logic

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) 

chức năng pJohnson nên thất bại với các lỗi sau:

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

tôi có thể làm cho các lỗi đi im lặng bằng cách sử dụng:

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

nhưng những gì tôi thực sự muốn làm là thực thi hàm alternativeFunction() nếu pJohnson(.18, parms) trả về lỗi.

Có vẻ như chức năng withCallingHandlers() sẽ giúp tôi, nhưng tôi không thể tìm ra cách để nắm bắt lỗi và làm cho nó chạy alternativeFunction() chỉ khi một điều kiện lỗi.

Trả lời

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

rõ ràng là một trường hợp của tôi không nghĩ "đủ thân thiện". cảm ơn bạn về sự phản ứng nhanh! –

+12

'if (thừa kế (t," try-error ")) alternativeFunction()' là một sự thay thế tốt đẹp, thậm chí còn nhiều hơn 'đối tượng' hơn '% trong%'. –

+0

Điểm tốt. Lớp trừu tượng đối tượng cho các lớp s3 rất trong suốt, tôi gần như quên nó ở đó. –

11

Một tùy chọn khác có thể là sử dụng biểu thức tryCatch. Dưới đây là một ví dụ:

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

Bạn có thể làm bất cứ điều gì bạn muốn trong khối lỗi, vì vậy trong trường hợp của bạn, một cái gì đó như thế này nên làm việc:

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

Đây không phải là thực sự việc sử dụng dự định của lỗi, nhưng nó ngắn gọn hơn một chút.

Các vấn đề liên quan