通过正则表达式过滤的选择性suppressWarnings()

时间:2013-05-13 08:33:53

标签: r warnings

尝试生成没有警告运行的代码,因此可以使用options(warn=2)运行,我正在寻找suppressWarnings例程的实现,它只会过滤与给定(向量)匹配的警告正则表达式。一些警告是我无法控制的,就像着名的

一样
Unrecognized record type 7, subtype 18 encountered in system file

在阅读某些SPSS文件时,我想有选择地抑制它们而不影响可能的其他警告。

是否已经实现了此功能?

2 个答案:

答案 0 :(得分:6)

使用withCallingHandlers

上提到的“muffleWarning”重启,使用invokeRestart?warning取消警告
withCallingHandlers({
    x <- 0
    warning("Unrecognized record 123")
    x <- x + 1
    warning("another warning")
    x + 1
}, warning = function(w) {
    if (startsWith(conditionMessage(w), "Unrecognized record"))
        invokeRestart("muffleWarning")
})

这有输出

[1] 2
Warning message:
In withCallingHandlers({ : another warning

(如果您希望停止警告,请使用tryCatch。正如@BenBolker提到的那样,它不处理翻译;制作更精细的正则表达式并不会令人满意。为了捕捉自己的警告,可以make and throw a subclass of warning

答案 1 :(得分:2)

为方便起见,我在@ martin-morgan的答案周围写了一个包装,它的作用类似于SuppressWarnings,除了可以将正则表达式传递给第二个参数(该参数将传递给grepl)或函数,该函数将使用点作为附加参数来应用于错误消息。

我使它支持公式表示法。

请参见下面的示例。

suppress_warnings <- function(.expr, .f, ...) {
  eval.parent(substitute(
  withCallingHandlers( .expr, warning = function(w) {
    cm <- conditionMessage(w)
    cond <- 
      if(is.character(.f)) grepl(.f, cm) else rlang::as_function(.f)(cm,...)
    if (cond) {
      invokeRestart("muffleWarning")
    }
  })
  ))
}


suppress_warnings({sqrt(-1); warning("ooops", call. = FALSE)}, startsWith, "o")
# Warning message:
# In sqrt(-1) : NaNs produced
suppress_warnings({sqrt(-1); warning("ooops", call. = FALSE)}, ~nchar(.)>10)
# Warning message:
# ooops
suppress_warnings({sqrt(-1); warning("ooops", call. = FALSE)}, "NaN")
# Warning message:
# ooops