Подавлять, регистрировать и возвращать значения в функции с предупреждениями в R - PullRequest
0 голосов
/ 28 мая 2020

Есть функция, у которой есть предупреждения, но она не влияет на конечный результат. Я хочу поймать предупреждение в журнале, подавить предупреждающее сообщение на консоли и вернуть значение.

fn1 <- function() {
    warning("this is a warning!")
    return(1)
}

Я пробовал withCallingHandlers, но предупреждающее сообщение все еще распечатывается, а tryCatch блокирует возврат стоимость. Например, я использую message, чтобы имитировать сохранение в журнале.

withCallingHandlers(expr = fn1(),
                    warning = function(w) {
                        message(paste0("saved to a file: ", w$message))
                        # write(w$message, "xxlocation")
                    }
)

вывод

saved to a file: this is a warning!
[1] 1
Warning message:
In fn1() : this is a warning!

Я могу использовать перезапуск, чтобы подавить предупреждение, но мое возвращаемое значение также подавляется . Это очень похоже на tryCatch:

withCallingHandlers(
    withRestarts(fn1(),
                 mufflewarn=function(msg) {
                     message(msg)
                 }),
    warning = function(w) {
        invokeRestart("mufflewarn", w$message)
    }
)
this is a warning!

Есть ли способ получить вывод:

saved to a file: this is a warning!
[1] 1

1 Ответ

0 голосов
/ 28 мая 2020

Оказывается, решение очень простое, просто используйте suppressWarnings снаружи, чтобы добиться цели:

suppressWarnings(withCallingHandlers(expr = fn1(),
                    warning = function(w) {
                        message(paste0("saved to a file: ", w$message))
                        # write(w$message, "xxlocation")
                    },
                    finally = function(x) suppressWarnings(x)
))
saved to a file: this is a warning!
[1] 1
...