如何将R警告信息重定向到标准输出?

11

我正在使用一个网格引擎运行R脚本。在这种设置下,STDERR非常重要,因此我希望保持其干净,并仅打印真实/严重/致命错误到STDERR。

问题是我的R脚本会生成各种不是真正严重警告的STDERR消息...例如,scan似乎会打印它读取的项目数到STDERR。

我是否可以从R内部将STDERR重定向到STDOUT?


这个答案可能会有帮助:https://dev59.com/0ILba4cB1Zd3GeqPfHtU#25307393 - jangorecki
3个回答

7

请看 sink() 的帮助页面:

‘sink’ 函数将 R 输出重定向到一个连接上。如果 ‘file’ 是一个字符 串,那么在重定向期间将建立一个该名称的文件连接。

默认情况下,普通的 R 输出(到连接 ‘stdout’)通过 ‘type = "output"’ 参数进行重定向。只有提示和(大部分)消息会继续在控制台中显示。通过 ‘sink(type = "message")’ 可以将发送到 ‘stderr()’ 的消息(包括来自 ‘message’、‘warning’ 和 ‘stop’ 的消息)进行重定向(见下文)。


1
我知道这已经过了一段时间,但对于未来查看此内容的人来说,我认为此答案可能不起作用,因为在使用type="message"时,所有错误都会被重定向,即使是严重的错误也是如此。至少文档是这样描述的,并且据我的经验也是这样工作的。 - juacala
这并不能解决问题。没有办法全局地更改特别是警告行为 - jamie.f.olson

1
@Dirk已经提供了答案,但我想补充一下,您可以使用stdout()来获取与STDOUT的连接。您可以在任何输出函数中使用它来将输出定向到那里。

1
不,那个“被接受”的答案并不能解决问题——sink()只能一起重定向“message”、“warning”和“error”,你无法单独隔离出“error”。 - Matthew Wise

0

将错误隔离出来的一种方法是使用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)
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接