sink() не работает в блоке tryCatch

Я пытаюсь закрыть свой экземпляр регистратора в блоке 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, чтобы я мог просматривать журналы, если возникла ошибка.

Как это исправить?


person user2763361    schedule 15.08.2014    source источник


Ответы (1)


Проблема в том, что настройка по умолчанию не печатать 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().

person MrFlick    schedule 15.08.2014
comment
Альтернативой является перезапись параметра warning.expression ala: перед предупреждениями в trycatch"> stackoverflow.com/questions/19433848/ - person Hansi; 15.08.2014