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

如何检查函数调用是否导致警告?

r
  •  50
  • Alex Holcombe  · 技术社区  · 15 年前

    也就是说,在调用函数之后,我想知道调用的实例是否产生了警告。

    4 回复  |  直到 15 年前
        1
  •  69
  •   Tyler Rinker DaniM    10 年前

    如果你想使用 try 构造,可以设置警告选项。另见 ?options tryCatch() :

    x <- function(i){
      if (i < 10) warning("A warning")
      i
    }
    
    tt <- tryCatch(x(5),error=function(e) e, warning=function(w) w)
    
    tt2 <- tryCatch(x(15),error=function(e) e, warning=function(w) w)
    
    tt
    ## <simpleWarning in x(5): A warning>
    
    tt2
    ## [1] 15
    
    if(is(tt,"warning")) print("KOOKOO")
    ## [1] "KOOKOO"
    
    if(is(tt2,"warning")) print("KOOKOO")
    

    要同时获得结果和警告:

    tryCatch(x(5),warning=function(w) return(list(x(5),w)))
    
    ## [[1]]
    ## [1] 5
    ## 
    ## [[2]]
    ## <simpleWarning in x(5): A warning>
    

    使用

    op <- options(warn=2)
    
    tt <- try(x())
    ifelse(is(tt,"try-error"),"There was a warning or an error","OK")
    options(op)
    
        2
  •  25
  •   Aaron - mostly inactive    14 年前

    在R-help邮件列表中(请参见 http://tolstoy.newcastle.edu.au/R/help/04/06/0217.html

    “如果要编写一个计算值并收集所有 警告您可以这样做:

    withWarnings <- function(expr) {
        myWarnings <- NULL
        wHandler <- function(w) {
            myWarnings <<- c(myWarnings, list(w))
            invokeRestart("muffleWarning")
        }
        val <- withCallingHandlers(expr, warning = wHandler)
        list(value = val, warnings = myWarnings)
    } 
    
        3
  •  6
  •   kohske    15 年前

    下面是一个例子:

    testit <- function() warning("testit") # function that generates warning.
    
    assign("last.warning", NULL, envir = baseenv()) # clear the previous warning
    
    testit() # run it
    
    if(length(warnings())>0){ # or !is.null(warnings())
        print("something happened")
    }
    

        4
  •  1
  •   Tom Greenwood    6 年前

    2019年更新

    library(purrr)
    library(lubridate)
    
    datelist <- list(a = "12/12/2002", b = "12-12-2003", c = "24-03-2005")
    
    # get all the everything
    quiet_list <- map(datelist, quietly(mdy))
    
    # find the elements which produced warnings
    quiet_list %>% map("warnings") %>% keep(~ !is.null(.))
    
    # or 
    quiet_list %>% keep(~ length(.$warnings) != 0)
    

    对于这个例子来说,这很简单,但是对于NAs可能很难发现的一长串数据帧,这非常有用。