У меня проблемы с использованием capture.output()
, и я не могу понять, почему, так как по большей части это просто оболочка для sink()
.
Рассмотрим этот тривиальный пример с использованием sink()
:
foo = function() warning("foo")
f = file()
sink(f, type = "message")
foo()
readLines(f)
## [1] "Warning message:" "In foo() : foo"
close(f)
Это работает, как и ожидалось. однако capture.output()
нет:
f = file()
capture.output(foo(), file = f, type = "message")
## Warning message:
## In foo() : foo
readLines(f)
## character(0)
close(f)
capture.output()
работает для сообщений:
bar = function() message("bar")
f = file()
capture.output(bar(), file = f, type = "message")
readLines(f)
## [1] "bar"
close(f)
Но согласно документации должны быть захвачены как сообщения, так и предупреждения:
Сообщения, отправленные на
stderr()
(включая сообщения отmessage
,warning
иstop
), перехватываютсяtype = "message"
.
Что я здесь упускаю?
sink()
это не проблема, потому что после этого вы вызываетеfoo()
самостоятельно. Но сcapture.output()
функцияfoo()
вызывается внутри оболочки, поэтому предупреждения не печатаются до тех пор, покаcapture.output()
не вернется, и в этот момент перенаправление будет закрыто. - person MrFlick   schedule 25.04.2020immediate = TRUE
для немедленной печати предупреждения, а не ожидания возврата функции верхнего уровня. - person mikeck   schedule 25.04.2020