首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >警告()在函数中不起作用吗?如何解决这个问题呢?

警告()在函数中不起作用吗?如何解决这个问题呢?
EN

Stack Overflow用户
提问于 2010-10-26 02:25:11
回答 5查看 2.6K关注 0票数 8
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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,因为这样会丢失函数返回的值(它仍然可能返回一个有效值,即使它生成了一个警告)。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-10-26 10:35:24

下面是suppressWarnings的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function (expr) 
{
    withCallingHandlers(expr, warning = function(w) invokeRestart("muffleWarning"))
}

我对它进行了一些调整,以计算警告的数量。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
}

一个测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
countWarnings(log(-1))
No. of warnings thrown: 1
[1] NaN

另一个测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
foo <- function()
{
  warning("first warning!")
  warning("second warning!")
  warning("third warning!")
  invisible()
}
countWarnings(foo())
No. of warnings thrown: 3
NULL
票数 5
EN

Stack Overflow用户

发布于 2010-10-26 02:33:50

您的示例确实返回了一个警告。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> 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 (特别是考虑到调用是可以返回的内容的一部分)。

票数 2
EN

Stack Overflow用户

发布于 2010-10-26 05:23:25

这可能是一个非常非常糟糕的变通办法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()

如果出现警告,则调用函数两次...尽管我相信一定会有更好的解决方案

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4020239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文