我正在使用网格引擎来运行 R 脚本。在这种设置下,STDERR 被认真对待,所以我想保持它干净,并且只将真实/严重/致命的错误打印到 STDERR。
问题是我的 R 脚本生成了各种 STDERR 消息,这些消息并不是真正严重的警告……例如,scan
似乎向 STDERR 打印了它读取的项目数。
我可以(从 R 中)将 STDERR 重定向到 STDOUT 吗?
查看帮助页面sink()
:
'sink' 将 R 输出转移到一个连接。如果 'file' 是一个字符串,则在转移期间将建立一个具有该名称的文件连接。
正常的 R 输出(到连接 'stdout')被默认的 'type = "output"' 转移。只有提示和(大多数)消息继续出现在控制台上。发送到 'stderr()' 的消息(包括来自 'message'、'warning' 和 'stop' 的消息)可以被 'sink(type = "message")' 转移(见下文)。
@Dirk 已经提供了答案,但我只想补充一点,您可以使用它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)
})