在 R 中捕获警告

Bil*_*ney 5 error-handling warnings r

我想将 R 中的警告捕获到文件中,然后让正常的警告代码接管。具体来说,我想将所有错误和警告记录到一两个文件中。对于错误,我可以通过向选项添加日志记录功能来使其工作error。但是,我找不到同样的方法来执行警告。我认为答案就在warning.expression选项中,但我无法使其发挥作用。

我现在正在尝试的内容如下。所有错误都会记录到文件“errors.txt”中,但“warnings.txt”中唯一的内容是一堆空行(消息文本不会保存,但会在每个警告中添加一行)。

对于我的解决方案,tryCatch这不是一个合理的选项,因为选项背后的遗留代码非常复杂,并且 tryCatch 在警告时停止执行。

logger.error <- function(file) {
  if (missing(file)) {
    stop("A filename must be given")
  }
  function() {
    cat(geterrmessage(), "\n", file=file, sep="", append=TRUE)
  }
}

logger.warning <- function(file) {
  if (missing(file)) {
    stop("A filename must be given")
  }
  function() {
    msg <- paste(names(warnings()), collapse="\n")
    cat("Warning: ", msg, "\n",
        file=file, sep="", append=TRUE)
  }
}

options(error=logger.error("errors.txt"),
        warning.expression=quote(logger.warning("warnings.txt")()),
        warn=1)

stop("test error")
warning("test warning")
a <- function(x) {
  if (x < 0) {
    stop("x cannot be < 0")
    print("a")
  }
  if (x < 10) {
    print("b")
    warning("x should not be < 10")
    print("c")
  }
  warning("This is a useless function")
  print("d")
}
a(-1)
a(1)
tryCatch(a(1),
         warning=function(w) {
           cat("A warning: ", w$message, "\n")
         },
         error=function(e) {
           cat("An error: ", e$message, "\n")
         })
Run Code Online (Sandbox Code Playgroud)