是否可以将警告存储在变量中以备后用?

时间:2019-07-03 15:50:36

标签: r

我正在用r编写一些代码以阅读excel并在成功后发送电子邮件。我想捕获在读取文件时生成的所有警告(例如,在期待日期但得到文本时),因为该文件存在一些不一致的地方,因此我希望将这些警告作为电子邮件的一部分。

我是R的新手,如果之前已经回答过,就无法在搜索中道歉。

到目前为止,我已经尝试将警告消息处理为字符串变量,它似乎可以正常工作,但仅当我运行代码段(Ctrl + Enter)时才可以。如果我全部运行,都不会捕获警告消息。

suppressWarnings(library("readxl"))

success = TRUE
readIssues <- "No file read issues detected"

tryCatch( {
  #read excel file
  pct <<- read_excel("Filename.xls")
}
, error = function(m) {success <<- FALSE}
)

readIssues <- attr(warnings(),"name")
readIssues <- paste(readIssues,sep=" ",collapse="\n")

我希望readIssues存储警告消息,以便以后在生成电子邮件时可以在代码中使用它们(例如“ AF1059 / R1059C32中的预期日期:收到“某些文本””)。

我很好奇为什么当我选择所有内容并按Ctrl + Enter时它运行正常,而当我按Ctrl + Alt + R时却运行不正常。

1 个答案:

答案 0 :(得分:1)

诀窍是在tryCatch中应用useCallingHandlers,然后提取所需的警告消息。如果有人在寻找答案,请在此处发布:

对此Post

的信用

代码:

suppressWarnings(library("readxl"))

success = TRUE
readIssues <- "No file read issues detected"

myWarnings <- NULL

wHandler <- function(w) {
  myWarnings <<- c(myWarnings,w)
  invokeRestart("muffleWarning")
}

tryCatch( {
pct <- withCallingHandlers(read_excel("Filename.xls"), warning = wHandler)
}
, error = function(m) {success <<- FALSE}
)

pickOut <- sapply(myWarnings, function(x) class(x)=="character")
readIssues <- myWarnings[pickOut]
readIssues <- paste(readIssues,sep="\n",collapse="\n")

谢谢大家的帮助!