r语言 - sink() 在 tryCatch 块中不起作用



我试图在finally块中关闭我的logger实例,如下所示:

logger <- file("all.Rout", open="wt")           
sink(logger, type="message")                                 
tryCatch({
    warning('test')
    message("A")
    log('a')
    message("B")
}, error = function(e) {
}, finally = {
    sink(type="message")
    close(logger)
})

但是,只有message("A")被保存到日志中,其他的都不保存。如果我执行以下操作,问题就解决了:

logger <- file("all.Rout", open="wt")           
sink(logger, type="message")                                 
tryCatch({
    warning('test')
    message("A")
    log('a')
    message("B")
}, error = function(e) {
}, finally = {
})
sink(type="message")
close(logger)

但是,我确实需要关闭在finally块中,以便在抛出错误时可以查看日志。

如何解决这个问题?

问题是,默认设置是不打印warnings,因为他们发生。它们被累积起来,然后在方便的时候打印出来。所以R不认为finally块是打印这些警告的方便时间,因为在那个时候您不是交互式的,可能看不到它们。一种解决方法是更改设置,以便在每个警告发生时报告,而不是等到当前调用完成。你可以用这个

logger <- file("log.txt", open="wt")           
sink(logger, type="message")                                 
tryCatch({
    ow<-options(warn=1)
    warning('test')
    message("A")
    log('a')
    message("B")
}, 
error = function(e) {
}, finally = {
    options(ow)
    sink(type="message")
    close(logger)
})

这里我们在try块的开始改变options(),然后在最后重置它们。

日志文件的内容为

Warning in doTryCatch(return(expr), name, parentenv, handler) : test
A

您会注意到,在另一种方法中,消息是反向的,即使警告先出现。同样,R只是在等待当前调用结束时向您返回警告消息,这是在tryCatch()完成运行之后。

最新更新