В 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), Люк Тирни писал:
"Если вы хотите написать функцию, которая вычисляет значение и собирает все вы можете сделать это так:
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)
}
вот пример:
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")
}
Возможно, это как-то непрямо, но я не знаю более простого пути.
Обновление 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 могут быть трудно обнаружить, это весьма полезно.