代码之家  ›  专栏  ›  技术社区  ›  Alex Holcombe

warnings()在函数中不起作用?怎么能解决这个问题呢?

  •  8
  • Alex Holcombe  · 技术社区  · 14 年前
    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 ,因为这样我就失去了函数返回的值(它可能仍然返回有效值,即使它生成了警告)。

    5 回复  |  直到 14 年前
        1
  •  5
  •   Richie Cotton Joris Meys    14 年前

    这是密码 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
    
        2
  •  2
  •   Joshua Ulrich    14 年前

    你的例子 返回警告。

    > 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 获取设置,直到调用完成(特别是考虑到调用是可返回内容的一部分)。

        3
  •  2
  •   kohske    14 年前

    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()
    

    如果出现警告,则调用函数两次。。。

        4
  •  1
  •   VitoshKa    14 年前

    这是一个解决办法

    ..my_warning <- 0L
    
    thisDoesWork<- function(){
        assign("last.warning", NULL, envir = baseenv())  
        warning("HEY, this is definitely a warning!", {..my_warning <<- ..my_warning+1L;""})
        str(last.warning)
        cat(paste("number of warnings:", ..my_warning, "\n"))
    }
    
    
    thisDoesWork()
    Warning in thisDoesWork() : HEY, this is definitely a warning!
    NULL
    number of warnings: 1 
    >     thisDoesWork()
    Warning in thisDoesWork() : HEY, this is definitely a warning!
    NULL
    number of warnings: 2 
    >     thisDoesWork()
    Warning in thisDoesWork() : HEY, this is definitely a warning!
    NULL
    number of warnings: 3 
    > 
    
        5
  •  0
  •   VitoshKa    14 年前

    在函数返回之前不会发出警告。 有关选项(“warn”),请参阅文档:

    options(warn=1L)
    thisDoesntWork()
    #Warning in thisDoesntWork() : HEY, this is definitely a warning!
    #number of warnings: 1