Подтвердить что ты не робот

Как проверить, вызывает ли вызов функции предупреждение?

В R, как я могу определить, вызывает ли вызов функции предупреждение?

То есть, после вызова функции я хотел бы знать, вызвал ли этот экземпляр вызова предупреждение.

4b9b3361

Ответ 1

Если вы хотите использовать конструкторы 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)

Ответ 2

В списке рассылки 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

вот пример:

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

Обновление 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 могут быть трудно обнаружить, это весьма полезно.