3

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

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块中,以便在引发错误时查看日志。

我该如何解决?

4

1 回答 1

3

问题是默认设置不是在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)
})

在这里,我们options()在 try 块的开头更改了它们,然后在 finally 中将它们重置。

然后日志文件的内容是

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

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

于 2014-08-15T02:45:50.417 回答