【发布时间】:2011-04-23 14:55:09
【问题描述】:
在 R 中,如何确定函数调用是否导致警告?
也就是说,在调用该函数之后,我想知道该调用的实例是否产生了警告。
【问题讨论】:
-
与 stackoverflow.com/q/4948361 密切相关,它提供了一些出色的答案以及错误捕获。
标签: r
在 R 中,如何确定函数调用是否导致警告?
也就是说,在调用该函数之后,我想知道该调用的实例是否产生了警告。
【问题讨论】:
标签: r
如果您想使用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)
【讨论】:
在 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)
}
【讨论】:
myWarnings;否则它会在函数内部创建一个新的myWarnings,而外部的不会更新。
这是一个例子:
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")
}
也许这是间接的,但我不知道更直接的方法。
【讨论】:
options(warn=1),在这种情况下,警告将打印到stdout,而不是stderr。
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 的一长串数据帧,这非常有用。
【讨论】:
对于一个简单的TRUE/FALSE 返回给定操作是否导致警告(或错误),您可以使用berryFunctions package 中的is.error 函数,在第一次设置@987654326 之后@ 以便将警告转换为错误。
例如,
options(warn = 2)
berryFunctions::is.error(as.numeric("x")) # TRUE
berryFunctions::is.error(as.numeric("3")) # FALSE
如果您想将选项更改限制为使用此功能,您可以创建一个新功能,如下所示。
is.warningorerror <- function(x) {
op <- options()
on.exit(options(op))
options(warn = 2)
berryFunctions::is.error(x)
}
is.warningorerror(as.numeric("x")) # TRUE
options("warn") # still 0 (default)
【讨论】: