如何捕获警告并仍然运行表达式

时间:2018-10-04 15:47:34

标签: r

我想发出警告并仍然运行表达式。

这里是一个例子:

x <- 0
tryCatch({
  x <- as.numeric("text") # this is NA and causes warning
  }, warning = function(w) {
    print("I am a message")
})
x
# x still 0

先前的代码捕获到警告并打印消息,但是x的值之后不等于NA,这意味着表达式由于警告而没有运行。

我可以使用suppressWarnings()<<-来运行表达式,如下所示:

x <- 0
tryCatch({
  x <- as.numeric("text")
  }, warning = function(w) {
    print("I am a message")
    suppressWarnings(x <<- as.numeric("text"))
})
x
# now x is NA

是否有更优雅的方法?也许是以下示例之一?

  • tryCatch()之外的另一个功能
  • 或使用tryCatch()的某些参数
  • 或除base以外的其他软件包
  • ...

1 个答案:

答案 0 :(得分:0)

this answer开始,该代码可以工作:

x <- 0
withCallingHandlers({
  x <- as.numeric("text")
  }, warning = function(w) {
    print("I am a message")
    invokeRestart("muffleWarning")
})
x

((我碰到这篇文章,是在寻找警告并更改函数返回值的方法。最后我找到了

which_nondefault_enc <- function(txt) {
    ans <- rep(NA, length(txt))
    for (i in seq(1, length(txt))) 
        ans[i] <- tryCatch(stringi::stri_enc_tonative(txt[i]), warning = function(w) return(NA))
    return(which(is.na(ans)))
}

返回向量的那些索引,其中将诸如“无法将''转换为本地编码”之类的警告用作选择标准。)