tryCatch 是处理条件最常用的解决方案。
但是,tryCatch中止执行并返回处理程序的值,而不是恢复代码的执行。这可能并不总是您想要的;有时你想处理一个条件并继续。
R 允许这样做,这要归功于它的incredibly powerful condition system。
例如,您可以选择静音所有消息:
suppressMessages(expr)
这里的好处是suppressMessages 不是魔法——它是一个普通的旧 R 函数,你可以自己编写它(但你确实需要了解条件系统,它的多功能性的代价是它是相当复杂)。
为了说明这一点,这里有另一种处理消息的方式——使用withCallingHandlers——它会抑制消息,继续执行调用它的代码,但同时将消息记录在一个列表中:
messages = list()
withCallingHandlers({
message('Hello world')
1 + 1
}, message = function (msg) {
messages <<- c(messages, msg)
tryInvokeRestart('muffleMessage')
})
tryInvokeRestart('muffleMessage') 与suppressMessages 工作的方法相同。唯一的区别是我们添加了代码来存储消息。
作为最后一步,上面的内容甚至可以包装在一个函数中:
with_logging = function (expr) {
messages = list()
log_message = function (msg) {
messages <<- c(messages, conditionMessage(msg))
tryInvokeRestart('muffleMessage')
}
result = withCallingHandlers(expr, message = log_message)
list(result = result, messages = messages)
}
并使用它:
with_logging({
message('this is a test')
1 + 1
})
$result
[1] 2
$messages
$messages[[1]]
[1] "this is a test\n"