op <- options(warn=0) #although doesn't work for any value of warn
assign("last.warning", NULL, envir = baseenv())
thisDoesntWork<- function() {
warning("HEY, this is definitely a warning!")
cat(paste("number of warnings:",length(warnings())))
}
>thisDoesntWork()
Warning in thisDoesntWork() : HEY, this is definitely a warning!
number of warnings: 0
警告数量应为 1 而不是 0 -
看起来warnings()
如果在函数内调用,则不返回任何内容。为什么?如何解决这个问题以在函数内检查是否发生警告并将其打印出来?
我不想使用tryCatch
,因为这样我就丢失了函数返回的值(即使它生成了警告,它仍然可能返回有效值)。
这是代码suppressWarnings
function (expr)
{
withCallingHandlers(expr, warning = function(w) invokeRestart("muffleWarning"))
}
我对其进行了一些调整以计算警告的数量。
countWarnings <- function(expr)
{
.number_of_warnings <- 0L
frame_number <- sys.nframe()
ans <- withCallingHandlers(expr, warning = function(w)
{
assign(".number_of_warnings", .number_of_warnings + 1L,
envir = sys.frame(frame_number))
invokeRestart("muffleWarning")
})
message(paste("No. of warnings thrown:", .number_of_warnings))
ans
}
A test:
countWarnings(log(-1))
No. of warnings thrown: 1
[1] NaN
另一个测试:
foo <- function()
{
warning("first warning!")
warning("second warning!")
warning("third warning!")
invisible()
}
countWarnings(foo())
No. of warnings thrown: 3
NULL
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)