R中的异常处理

时间:2010-04-12 14:26:29

标签: r exception-handling

有人在R中有异常处理的示例/教程吗?官方文档非常简洁。

5 个答案:

答案 0 :(得分:59)

基本上你想使用tryCatch()功能。查看帮助(“tryCatch”)了解更多详情。

这是一个简单的例子(请记住,你可以做任何你想要的错误):

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

看看这些相关问题:

答案 1 :(得分:31)

除了Shane的答案指向其他StackOverflow讨论之外,您还可以尝试使用代码搜索功能。这个原始答案指出谷歌的代码搜索已经停止,但你可以尝试

仅供记录,还有try,但tryCatch可能更合适。我尝试了快速计算谷歌代码搜索,但尝试对动词本身进行过多的误报 - 但似乎tryCatch被广泛使用。

答案 2 :(得分:21)

相关谷歌搜索的结果帮助了我:http://biocodenv.com/wordpress/?p=15

for(i in 1:16){
result <- try(nonlinear_modeling(i));
if(class(result) == "try-error") next;
}

答案 3 :(得分:7)

重新启动功能在从Lisp继承的R中非常重要。如果你想在循环体中调用一些函数并且你只是希望程序在函数调用崩溃时继续运行,这很有用。试试这段代码:

for (i in 1:20) withRestarts(tryCatch(
if((a <- runif(1))>0.5) print(a) else stop(a),
finally = print("loop body finished!")), 
abort = function(){})

答案 4 :(得分:7)

函数trycatch()非常简单,并且有很多很好的教程。 R中错误处理的一个很好的解释可以在Hadley Wickham的书Advanced-R中找到,接下来是{strong>非常基本介绍withCallingHandlers()withRestarts()尽可能少的话:

让我们说低级程序员编写一个函数来计算绝对值 值。他不知道如何计算它,但知道how to construct an error和。{ 努力传达他的天真:

low_level_ABS <- function(x){
    if(x<0){
        #construct an error
        negative_value_error <- structure(
                    # with class `negative_value`
                    class = c("negative_value","error", "condition"),
                    list(message = "Not Sure what to with a negative value",
                         call = sys.call(), 
                         # and include the offending parameter in the error object
                         x=x))
        # raise the error
        stop(negative_value_error)
    }
    cat("Returning from low_level_ABS()\n")
    return(x)
}

中级程序员还会编写一个函数来计算绝对值,利用可疑的不完整low_level_ABS函数。他知道低级代码会抛出negative_value 如果x的值为负数且建议解决问题,则会出错 建立restart,允许mid_level_ABS的用户控制。{1}} mid_level_ABSnegative_value错误中恢复(或不恢复)的方式。

mid_level_ABS <- function(y){
    abs_y <- withRestarts(low_level_ABS(y), 
                          # establish a restart called 'negative_value'
                          # which returns the negative of it's argument
                          negative_value_restart=function(z){-z}) 
    cat("Returning from mid_level_ABS()\n")
    return(abs_y)
}

最后,高级程序员使用mid_level_ABS函数进行计算 绝对值,并建立一个告诉的条件处理程序 mid_level_ABS使用重新启动从negative_value错误中恢复 处理程序。

high_level_ABS <- function(z){
    abs_z <- withCallingHandlers(
            # call this function
            mid_level_ABS(z) ,
            # and if an `error` occurres
            error = function(err){
                # and the `error` is a `negative_value` error
                if(inherits(err,"negative_value")){
                    # invoke the restart called 'negative_value_restart'
                    invokeRestart('negative_value_restart', 
                                     # and invoke it with this parameter
                                     err$x) 
                }else{
                    # otherwise re-raise the error
                    stop(err)
                }
            })
    cat("Returning from high_level_ABS()\n")
    return(abs_z)
}

所有这一切的重点在于使用withRestarts()withCallingHandlers()功能 high_level_ABS能够告诉mid_level_ABS如何从错误中恢复 low_level_ABS错误引发而不停止执行 mid_level_ABS,这是tryCatch()无法做到的事情:

> high_level_ABS(3)
Returning from low_level_ABS()
Returning from mid_level_ABS()
Returning from high_level_ABS()
[1] 3
> high_level_ABS(-3)
Returning from mid_level_ABS()
Returning from high_level_ABS()
[1] 3

在实践中,low_level_ABS代表mid_level_ABS调用的函数 很多(甚至数百万次),正确的错误方法 处理可能因情况而异,并且选择如何处理特定错误 留给更高级别的职能(high_level_ABS)。