编写一个tryCatch
来处理错误值,但会忽略警告。作为一个例子
foo <- function(x) {
if (x == 1) {
warning('Warning')
} else if (x == 0) {
stop('Error')
}
return(1)
}
bar <- function(x){
tryCatch(
expr = foo(x),
error = identity,
warning = function(w) invokeRestart("muffleWarning")
)
}
所以foo
如果传递0则会发出警告,如果传递1则会出错。bar
的意图是如果传递0则会出错,但会抑制警告如果您传递1,则由bar
生成。invokeRestart("muffleWarning")
命令来自suppressWarnings
的定义。它在我这里的建筑中不起作用,我不知道为什么。 (具有讽刺意味的是,它会产生错误,因此尝试成功升级警告时我并不想要出现我无法解释的错误。)
bar
的定义将起作用
bar <- function(x){
tryCatch(
expr = foo(x),
error = SomeFunctionThatDoesNotMatter,
warning = function(w){suppressWarnings(foo(x))}
)
}
bar
完全符合我的要求,但它以一种潜在的可怕方式完成。想象一下,我不是expr = foo(x)
,而是expr = lapply(X=1:50, ...)
而FUN
需要一个小时才能运行。如果X[50]
生成唯一警告,则我的运行时间从50小时增加到100小时(yuck)。
invokeRestart("muffleWarning")
在上面的示例中不起作用?tryCatch
时,应该为warning
分配什么功能,以便让代码能够简单地继续运行并抑制生成的警告?感谢阅读!
答案 0 :(得分:1)
在遵循nrussell的直觉后我遇到了这个问题。解决方案是替换泛型
tryCatch({
some_fn()
}, warning = function(w) {
print(paste('warning:', w))
}, error = function(e) {
print(paste('error:', e))
})
与
tryCatch({
some_fn()
}, error = function(e) {
print(paste('error:', e))
})
这种格式/语法对我有用。您可以轻松地将其包含在您需要的功能中