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

时间:2010-10-11 02:20:20

标签: r

在R中,如何确定函数调用是否会导致警告?

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

5 个答案:

答案 0 :(得分:62)

如果要使用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>

使用try

op <- options(warn=2)

tt <- try(x())
ifelse(is(tt,"try-error"),"There was a warning or an error","OK")
options(op)

答案 1 :(得分:22)

在R-help邮件列表上(见http://tolstoy.newcastle.edu.au/R/help/04/06/0217.html),Luke Tierney写道:

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

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

答案 2 :(得分:6)

这是一个例子:

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")
}

也许这是间接的,但我不知道更直接的方式。

答案 3 :(得分:1)

2019年更新

您可以从purrr包中“安静地”使用它,该包返回输出,结果,警告和错误的列表。然后,您可以按名称提取每个元素。例如,如果您有一个列表,希望将其映射到函数上,并找到返回警告的元素,则可以

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)

在此示例中,它是微不足道的,但是对于一堆很难识别NA的数据帧列表,这是非常有用的。

答案 4 :(得分:0)

对于给定操作是否导致警告(或错误)的简单 TRUE/FALSE 返回,您可以使用 is.error { {3}},在第一次设置 berryFunctions 之后,将警告转换为错误。

例如,

options(warn = 2)

如果您想将选项更改限制为使用此函数,您可以创建一个新函数,如下所示。

options(warn = 2)
berryFunctions::is.error(as.numeric("x")) # TRUE
berryFunctions::is.error(as.numeric("3")) # FALSE