Можно ли хранить предупреждения в переменной для последующего использования? - PullRequest
2 голосов
/ 03 июля 2019

Я пишу код на 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 Ответ

1 голос
/ 09 июля 2019

Хитрость заключалась в том, чтобы применить useCallingHandlers в tryCatch, а затем извлечь необходимые предупреждающие сообщения. Публикуйте здесь, если кто-то ищет ответ:

Кредит к этому Пост

Код:

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")

Спасибо всем за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...