Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sink()不';t在tryCatch块中工作_R_Logging_Exception Handling_Try Catch_Sink - Fatal编程技术网

sink()不';t在tryCatch块中工作

sink()不';t在tryCatch块中工作,r,logging,exception-handling,try-catch,sink,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块中关闭我的记录器实例,如下所示:

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
块中关闭日志,以便在抛出错误时可以查看日志


如何解决此问题?

问题在于默认设置是不在出现警告时打印警告。它们被积累起来,然后在方便的时候打印出来。因此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)
})

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

另一种方法是覆盖选项warning.ala:
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)
})
Warning in doTryCatch(return(expr), name, parentenv, handler) : test
A