有没有人在R中有异常处理的示例/教程?官方文档非常简洁.
基本上你想要使用这个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"))
看看这些相关问题:
相当于R中的"throw"
捕获错误然后分支逻辑
/sf/ask/17360801/?q=[r]+trycatch
除了Shane的回答指向其他StackOverflow讨论,您可以尝试代码搜索功能.这个原始答案指出谷歌的代码搜索已经停止,但你可以试试
Github在例如此查询中搜索language = R中的tryCatch ;
Ohloh/Blackduck代码搜索例如对R文件中的tryCatch的此查询
在对整个Debian档案的顶部Debian的代码搜索引擎
只是为了记录在案,也有try
,但tryCatch
可能是可取的.我尝试了快速计算谷歌代码搜索,但尝试对动词本身有太多的误报 - 但它似乎tryCatch
被更广泛地使用.
相关谷歌搜索的结果帮助了我:http://biocodenv.com/wordpress/?p = 15.
for(i in 1:16){ result <- try(nonlinear_modeling(i)); if(class(result) == "try-error") next; }
重新启动函数在从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(){})
该功能trycatch()
非常简单,并且有很多很好的教程.错误R中处理的优良解释可在哈德利韦翰的书中找到高级-R ,以及接踵而来的是一个非常基本的介绍到withCallingHandlers()
,并withRestarts()
在尽可能少的话尽可能:
让我们说低级程序员编写一个函数来计算绝对值.他不知道如何计算它,但知道如何构造错误并努力传达他的天真:
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
控制mid_level_ABS
从negative_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
).