为了生成在没有警告的情况下运行的代码,因此可以运行options(warn=2),我正在寻找一个suppressWarnings例程的实现,它只会过滤与给定(矢量)正则表达式匹配的警告.有些警告就像我所知,就像着名的警告一样
Unrecognized record type 7, subtype 18 encountered in system file
Run Code Online (Sandbox Code Playgroud)
在阅读某些SPSS文件时,我想有选择地抑制它们,而不会影响其他可能的警告.
是否已经实现了此功能?
使用withCallingHandlers和invokeRestart,使用上面提到的"muffleWarning"重启来抑制警告?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")
})
Run Code Online (Sandbox Code Playgroud)
这有输出
[1] 2
Warning message:
In withCallingHandlers({ : another warning
Run Code Online (Sandbox Code Playgroud)
(tryCatch如果您希望停止警告,请使用).正如@BenBolker提到的那样,它不处理翻译; 制作更精细的正则表达式并不会令人满意.为了捕获自己的警告,可以制作并抛出警告的子类.
为了方便起见,我围绕 @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
Run Code Online (Sandbox Code Playgroud)