¿Cómo puedo verificar si una llamada a función da como resultado una advertencia?

En R, ¿cómo puedo determinar si una llamada a función da como resultado una advertencia?

Es decir, después de llamar a la función me gustaría saber si esa instancia de la llamada produjo una advertencia.

Si desea usar las construcciones de try , puede establecer las opciones para advertir. Ver también ?options . Mejor es usar 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 ##  tt2 ## [1] 15 if(is(tt,"warning")) print("KOOKOO") ## [1] "KOOKOO" if(is(tt2,"warning")) print("KOOKOO") 

Para obtener el resultado y la advertencia:

 tryCatch(x(5),warning=function(w) return(list(x(5),w))) ## [[1]] ## [1] 5 ## ## [[2]] ##  

Usando try

 op <- options(warn=2) tt <- try(x()) ifelse(is(tt,"try-error"),"There was a warning or an error","OK") options(op) 

En la lista de correo de ayuda de R (ver http://tolstoy.newcastle.edu.au/R/help/04/06/0217.html ), Luke Tierney escribió:

“Si desea escribir una función que calcule un valor y recopile todas las advertencias, podría hacerlo así:

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

Aquí hay un ejemplo:

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

tal vez esto es de alguna manera indirecta, pero no sé la manera más directa.