我正在使用一个网格引擎运行R脚本。在这种设置下,STDERR非常重要,因此我希望保持其干净,并仅打印真实/严重/致命错误到STDERR。
问题是我的R脚本会生成各种不是真正严重警告的STDERR消息...例如,scan
似乎会打印它读取的项目数到STDERR。
我是否可以从R内部将STDERR重定向到STDOUT?
请看 sink()
的帮助页面:
‘sink’ 函数将 R 输出重定向到一个连接上。如果 ‘file’ 是一个字符 串,那么在重定向期间将建立一个该名称的文件连接。
默认情况下,普通的 R 输出(到连接 ‘stdout’)通过 ‘type = "output"’ 参数进行重定向。只有提示和(大部分)消息会继续在控制台中显示。通过 ‘sink(type = "message")’ 可以将发送到 ‘stderr()’ 的消息(包括来自 ‘message’、‘warning’ 和 ‘stop’ 的消息)进行重定向(见下文)。
stdout()
来获取与STDOUT的连接。您可以在任何输出函数中使用它来将输出定向到那里。将错误隔离出来的一种方法是使用try catch,在主块中,所有内容都发送到stdout,然后代码抛出的任何错误都会被捕获并发送到stderr。
这只处理在代码中抛出的错误,而不是记录错误消息,但可能是您的解决方案。
result = tryCatch({
sink(stdout(), type = "message") # sink all messages, warnings, errors to stdout
message('Starting! This message will go to stdout')
warning('Warning! This message will go to stdout')
error('Error! This message will ALSO go to stdout')
#Call your code here, e.g.
#...
stop('An error is thrown', call.=FALSE)
#...
}, error = function(e) {
sink(NULL, type="message") # close the sink
#Now sink closed, you can re-raise the error, and it will be directed to sterr:
stop(paste0('Error: ', e), call.=FALSE)
})