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