Если вы делаете хотите сохранить все предупреждения, возможно, во внешний файл, вы можете заключить код, который вы выполняете в вызове, в withCallingHandlers()
. Это позволяет вам определить «обработчик» для условий предупреждения. Обработчик - это функция, которая запускается каждый раз, когда встречается предупреждение; Вы можете использовать его, чтобы делать практически все, что вы хотите, с помощью предупреждающего сообщения. (Для превосходного краткого введения в эту тему, см. Ответ Мартина Моргана на этот ТАК вопрос .)
Здесь я определяю обработчик, который: (a) добавляет предупреждение в файл; и (b) использует invokeRestart()
для продолжения оценки функции в месте, где было выдано предупреждение. Очевидно, вы можете изменить это в соответствии с вашими потребностями:
# DEFINE A WRAPPER FUNCTION THAT:
# - EVALUATES A GIVEN EXPRESSION
# - SAVES ALL WARNINGS TO A LOGFILE
saveAllWarnings <- function(expr, logFile="warning_log.R") {
withCallingHandlers(expr,
warning=function(w) {
cat(conditionMessage(w), "\n\n", file=logFile, append=TRUE)
invokeRestart("muffleWarning")
})
}
# TRY IT OUT WITH A MADE UP FUNCTION THAT THROWS SEVERAL WARNINGS
messyFun <- function() {
warning("oops")
warning("boops")
warning("can't I get anything right?")
1
}
saveAllWarnings(messyFun(), logFile="messyFun warning log.R")