如何检查函数调用是否导致警告?

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

这里是一个例子:

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

也许这是间接的,但我不知道更直接的方式。