【发布时间】:2016-06-17 13:03:52
【问题描述】:
我想要做什么
编写一个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 则会出现错误,但它会抑制由 @987654326 生成的警告@如果你传递一个1。invokeRestart("muffleWarning")命令来自suppressWarnings的定义。它在我这里的建筑中不起作用,我不知道为什么。 (具有讽刺意味的是,它会产生一个错误,因此尝试成功将我不想要的警告升级为我无法解释的错误。)
我不想使用的哑答案 (TM) 以及为什么
bar 的这个定义会起作用
bar <- function(x){
tryCatch(
expr = foo(x),
error = SomeFunctionThatDoesNotMatter,
warning = function(w){suppressWarnings(foo(x))}
)
}
bar 完全按照我的意愿去做,但它以一种可能很糟糕的方式做到了。想象一下,我有expr = lapply(X=1:50, ...) 而不是expr = foo(x),而FUN 需要一个小时才能运行。如果X[50] 生成唯一的警告,那么我的运行时间从 50 小时增加到 100 小时(糟糕)。
问题
- 为什么
invokeRestart("muffleWarning")在我上面的示例中不起作用? - 使用
tryCatch时,应将什么函数分配给warning以允许代码继续运行并抑制生成的警告?
感谢阅读!
【问题讨论】:
-
试试
warning = function(w) { } -
我需要
bar仍然返回foo(x)的值 -
使用
withCallingHandlers(),图解here -
@MartinMorgan:行得通。似乎有一点开销(这几乎可以肯定是不可避免的)。你想“回答”这个问题吗?另外,知道为什么
invokeRestart("muffleWarning")在withCallingHandlers()中有效,但在tryCatch中无效? -
之前已经给出了使用
withCallingHandlers()的答案,所以没有价值'answering'了。请参阅 ?withCallingHandlers 了解与 tryCatch 的区别。前者将调用堆栈记住到发出条件信号的位置,因此可以从中断的地方继续执行。 tryCatch 将调用堆栈展开到建立 tryCatch 的位置,因此无法恢复执行。您可以将错误处理程序与 withCallingHandlers 一起使用,或者将警告处理程序与 tryCatch 一起使用,但两者都没有意义:错误意味着代码无法继续,而警告并不意味着您必须停止。
标签: r try-catch suppress-warnings