捕获R

时间:2017-02-25 20:59:39

标签: r error-handling warnings

我想将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")
         })

0 个答案:

没有答案