如何在R语言中覆盖函数抛出的警告信息?
替换函数的无用警告并保留返回值
我有一个函数f,当输入参数大于1时会抛出无意义的警告,但能正常返回输入值:
f <- function(a) { if (a > 1) { warning("an uninformative warning") } a }
尝试用withCallingHandlers替换警告时,会同时输出新旧两个警告:
g1 <- function(b) { withCallingHandlers( x <-f(b), warning = function(w) { warning("A more informative warning") }) x } g1(2) #> Warning in (function (w) : A more informative warning #> Warning in f(b): an uninformative warning #> [1] 2
使用tryCatch则无法保留函数的返回值,这显然不是我们想要的结果。
解决方案:用invokeRestart抑制原警告
要实现替换警告且仅保留自定义警告,同时不丢失返回值,只需在withCallingHandlers的警告处理函数中调用invokeRestart("muffleWarning"),它会阻止原警告继续向上传递:
g2 <- function(b) { withCallingHandlers( x <- f(b), warning = function(w) { warning("A more informative warning") invokeRestart("muffleWarning") # 抑制原警告输出 } ) x } # 测试效果 g2(2) #> Warning in (function (w) : A more informative warning #> [1] 2
用tryCatch实现的替代方案
如果偏好使用tryCatch,也可以通过在警告处理分支中返回已赋值的变量来保留返回值:
g3 <- function(b) { tryCatch( expr = { x <- f(b) x }, warning = function(w) { warning("A more informative warning") return(x) } ) } g3(2) #> Warning in (function (w) : A more informative warning #> [1] 2
内容的提问来源于stack exchange,提问作者olivroy
相关产品推荐
相关产品推荐

