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
,因为这样会丢失函数返回的值(它仍然可能返回一个有效值,即使它生成了一个警告)。
发布于 2010-10-26 10:35:24
下面是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
}
一个测试:
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
发布于 2010-10-26 02:33:50
您的示例确实返回了一个警告。
> assign("last.warning", NULL, envir = baseenv())
> thisDoesntWork <- function() {
+ warning("HEY, this is definitely a warning!")
+ cat(paste("number of warnings:",length(warnings())),"\n")
+ }
> thisDoesntWork()
number of warnings: 0
Warning message:
In thisDoesntWork() : HEY, this is definitely a warning!
> warnings() # HEY, here's your warning!!!
Warning message:
In thisDoesntWork() : HEY, this is definitely a warning!
文档并不明确,但我认为在调用完成之前不会设置last.warning
(特别是考虑到调用是可以返回的内容的一部分)。
发布于 2010-10-26 05:23:25
这可能是一个非常非常糟糕的变通办法。
fw<-function(){warning("warn...");return(99)}
fn<-function(){return(88)}
f<-function(){
w<-0
v<-NULL
v<-tryCatch(fw(),warning=function(w){w})
if("warning"%in%class(v)){
w<-w+1 # e.g., count up the number of warning
v<-fw()
}
print(v)
v<-NULL
v<-tryCatch(fn(),warning=function(w){w})
if("warning"%in%class(v)){
w<-w+1 # e.g., count up the number of warning
v<-fn()
}
print(v)
}
f()
如果出现警告,则调用函数两次...尽管我相信一定会有更好的解决方案
https://stackoverflow.com/questions/4020239
复制相似问题