10

我正在使用网格引擎来运行 R 脚本。在这种设置下,STDERR 被认真对待,所以我想保持它干净,并且只将真实/严重/致命的错误打印到 STDERR。

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

我可以(从 R 中)将 STDERR 重定向到 STDOUT 吗?

4

3 回答 3

7

查看帮助页面sink()

'sink' 将 R 输出转移到一个连接。如果 'file' 是一个字符串,则在转移期间将建立一个具有该名称的文件连接。

正常的 R 输出(到连接 'stdout')被默认的 'type = "output"' 转移。只有提示和(大多数)消息继续出现在控制台上。发送到 'stderr()' 的消息(包括来自 'message'、'warning' 和 'stop' 的消息)可以被 'sink(type = "message")' 转移(见下文)。

于 2010-11-06T13:07:38.217 回答
1

@Dirk 已经提供了答案,但我只想补充一点,您可以使用它stdout()来连接到 STDOUT。您可以在任何输出函数中使用它来直接输出。

于 2010-11-06T13:10:16.290 回答
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)
})
于 2021-03-12T21:18:03.807 回答