sink()在tryCatch块中不起作用

时间:2014-08-15 02:18:23

标签: r logging exception-handling try-catch sink

我正在尝试在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块中,以便在抛出错误时可以查看日志。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分: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)
})

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

然后是日志文件的内容

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

你会注意到,在另一种方法中,即使警告首先出现,消息也会被反转。再一次,R只是等到当前调用结束时才向你返回警告信息,这是在tryCatch()完成运行之后。