Следуя предложению для этого вопроса: Как сохранить предупреждения и ошибки как выходные данные из функции? .
Теперь я могу перехватить сообщение, предупреждение, ошибку с помощью tryCatch и сохранить тип журнала и время в списке.
factory <- function(fun) {
function(...) {
warn <- err <- msg <- NULL
res <- withCallingHandlers(
tryCatch(fun(...), error=function(e) {
new_e <- err
new_e[[length(new_e) + 1]] <- list(time = Sys.time(),
type = "error",
log = conditionMessage(e))
err <<- new_e
NULL
}), warning=function(w) {
new_w <- warn
new_w[[length(new_w) + 1]] <- list(time = Sys.time(),
type = "warning",
log = conditionMessage(w))
warn <<- new_w
invokeRestart("muffleWarning")
}, message = function(m) {
new_w <- msg
new_w[[length(new_w) + 1]] <- list(time = Sys.time(),
type = "message",
log = conditionMessage(m))
msg <<- new_w
invokeRestart("muffleMessage")
})
list(res, warn=warn, err=err, msg=msg)
}
}
test <- function(){
print("AAAAAAA")
message("BBBBBB")
print("CCCC")
warning("DDDDDDDDDDD")
Sys.sleep(1)
warning("EEEEEEEEEEEEEEE")
#stop("FFFFFFFFFFFFF")
warning("GGGGGGGGGGGGGG")
return(NULL)
}
a <- factory(test)()
Результаты показаны ниже
> a
[[1]]
NULL
$warn
$warn[[1]]
$warn[[1]]$`time`
[1] "2019-10-21 22:02:39 AEST"
$warn[[1]]$type
[1] "warning"
$warn[[1]]$log
[1] "DDDDDDDDDDD"
$warn[[2]]
$warn[[2]]$`time`
[1] "2019-10-21 22:02:40 AEST"
$warn[[2]]$type
[1] "warning"
$warn[[2]]$log
[1] "EEEEEEEEEEEEEEE"
$warn[[3]]
$warn[[3]]$`time`
[1] "2019-10-21 22:02:40 AEST"
$warn[[3]]$type
[1] "warning"
$warn[[3]]$log
[1] "GGGGGGGGGGGGGG"
$err
NULL
$msg
$msg[[1]]
$msg[[1]]$`time`
[1] "2019-10-21 22:02:39 AEST"
$msg[[1]]$type
[1] "message"
$msg[[1]]$log
[1] "BBBBBB\n"
На следующем шаге я могу использовать функцию httr для вызова RESTAPI для сохранения журналов в базе данных. В качестве альтернативы, сообщение может быть напрямую сохранено в базе данных, когда сообщения генерируются путем обновления заводской функции.
Единственная проблема в том, что функция не может захватить print
и cat
. Однако этот вопрос Почему message () является лучшим выбором, чем print () в R для написания пакета? Предложение message
Функция лучше, чем print
и cat
. Это может быть не большой проблемой для нынешнего этапа.