在R中,如何确定函数调用是否会导致警告?
也就是说,在调用该函数之后,我想知道该调用的实例是否产生了警告。
答案 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