Захват сообщения, предупреждений и ошибок в веб-API в R - PullRequest
1 голос
/ 21 октября 2019

Я разрабатываю основную функцию для вызова других сценариев / функций в R и хотел бы захватить все выходные данные (например, print, cat, message, stop) в веб-API (например, RESTAPI с методом POST). Некоторые фиктивные коды для демонстрации моих идей

url <- "https://example.com/api/log"
capture.output({
   print("print")
   cat("cat")
   message("message")
   stop("stop")
}, file=url)

Я не уверен, как использовать URL в connection. Было бы замечательно, если бы я мог захватывать типы вывода (например, печать, сообщение и остановка) и в режиме реального времени (т.е. перенаправлять вывод сразу после генерации).

Веб-интерфейс API будет хранить три элемента информации * timestamp:может обрабатываться webapi * тип: (печать, сообщение или остановка) * журнал: фактическое сообщение

Спасибо за любые предложения.

1 Ответ

0 голосов
/ 21 октября 2019

Следуя предложению для этого вопроса: Как сохранить предупреждения и ошибки как выходные данные из функции? .

Теперь я могу перехватить сообщение, предупреждение, ошибку с помощью 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. Это может быть не большой проблемой для нынешнего этапа.

...