如果参数不满足许多条件,我必须调用一个抛出错误的函数。
条件非常复杂,我无法在100%的时间内尝试满足它们(我必须重新输入函数在内部检查的所有条件)。 相反,我应该用不同的参数重试(根据需要多次填充我的表格)。
在其他语言中,我可以围绕通话编写一个catch块。
但是,在R中,tryCatch的工作方式似乎有所不同:您可以使用finally=
给出代码,但在执行finally-code之后,外部函数无论如何都会终止。
这是一个最小的例子:
sometimesError <- function() {
if(runif(1)<0.1) stop("err")
return(1)
}
fct <- function() {
theSum <- 0
while(theSum < 20) {
tryCatch( theSum <- theSum + sometimesError() )
}
return(theSum)
}
fct() # this should always evaluate to 20, never throw error
(我已阅读"Is there a way to source()
and continue after an error?",以及其他一些帖子,但我不认为它们适用于此。他们实现源代码继续逐语句而不管错误,就好像它在顶部执行一样另一方面,我对被叫函数终止感到满意,并且应该继续使用调用者代码。
答案 0 :(得分:1)
您可以将函数传递给error
的{{1}}参数,以指定出现错误时应该发生的事情。在这种情况下,您可以在出现错误时返回0
tryCatch
正如@rawr在评论中提到的那样,在这种情况下,您也可以将fct <- function() {
theSum <- 0
while(theSum < 20) {
theSum <- theSum + tryCatch(sometimesError(), error=function(e) 0)
}
return(theSum)
}
替换为tryCatch
。
try