【问题标题】:How can I redirect R warning messages to STDOUT?如何将 R 警告消息重定向到 STDOUT?
【发布时间】:2011-05-06 00:02:57
【问题描述】:

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

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

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

【问题讨论】:

标签: r redirect stdout stderr


【解决方案1】:

查看sink()的帮助页面:

‘sink’将 R 输出转移到一个连接。如果“文件”是一个字符 字符串,将建立具有该名称的文件连接 转移的持续时间。

正常 R 输出(到连接“stdout”)由 默认‘类型=“输出”’。只有提示和(大多数)消息 继续出现在控制台上。发送到“stderr()”的消息 (包括来自“消息”、“警告”和“停止”的消息)可以 被‘sink(type = "message")’转移(见下文)。

【讨论】:

  • 我知道已经有一段时间了,但对于未来的人来说,我认为这个答案可能不起作用,因为使用 type="message" 时所有错误都会被重定向,即使是严重的错误。至少文档是这样的,并且根据我的经验,它似乎是这样工作的。
  • 这并不能解决问题。没有办法全局更改特别是警告行为
【解决方案2】:

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

【讨论】:

  • 不,“接受”的答案并不能解决问题 - sink() 只能将“消息”、“警告”和“错误”重定向在一起,你不能只分离出“错误” '。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    • 2012-06-16
    • 2022-08-20
    • 2014-07-22
    • 1970-01-01
    相关资源
    最近更新 更多