【问题标题】:Suppress warnings using tryCatch in R在 R 中使用 tryCatch 抑制警告
【发布时间】: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 小时(糟糕)。

问题

  1. 为什么invokeRestart("muffleWarning") 在我上面的示例中不起作用?
  2. 使用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


【解决方案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))
})

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 2011-03-31
    相关资源
    最近更新 更多