Как я могу проверить, приводит ли вызов функции к предупреждению? - PullRequest
51 голосов
/ 11 октября 2010

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

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

Ответы [ 4 ]

63 голосов
/ 11 октября 2010

Если вы хотите использовать конструкции try, вы можете установить параметры для warn. Смотрите также ?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)
22 голосов
/ 09 февраля 2011

В списке рассылки 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)
} 
6 голосов
/ 11 октября 2010

вот пример:

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

возможно, это как-то косвенно, но я не знаю более простой способ.

1 голос
/ 27 марта 2019

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, это очень полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...