使用R中的tryCatch抑制警告

时间:2016-03-03 23:27:35

标签: r try-catch suppress-warnings

我想做什么

编写一个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的定义。它在我这里的建筑中不起作用,我不知道为什么。 (具有讽刺意味的是,它会产生错误,因此尝试成功升级警告时我并不想要出现我无法解释的错误。)

我不想使用的Dumb Answer(TM)以及为什么

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)。

问题

  1. 为什么invokeRestart("muffleWarning")在上面的示例中不起作用?
  2. 使用tryCatch时,应该为warning分配什么功能,以便让代码能够简单地继续运行并抑制生成的警告?
  3. 感谢阅读!

1 个答案:

答案 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))
})

这种格式/语法对我有用。您可以轻松地将其包含在您需要的功能中