【问题标题】:Can you make R print more detailed error messages?你能让 R 打印更详细的错误信息吗?
【发布时间】:2011-11-21 01:55:29
【问题描述】:

我经常对 R 的神秘错误消息感到沮丧。我不是在交互式会话期间谈论,我的意思是当您运行脚本时。错误消息不会打印出行号,而且通常很难追踪有问题的行以及错误原因(即使您可以找到位置)。

最近,我的 R 脚本失败了,出现了非常有见地的消息:“执行已停止。”我通常跟踪此类错误的方法是在整个脚本中放置大量打印语句——但这很痛苦。有时我必须在交互式会话中逐行浏览脚本才能找到错误。

对于如何使 R 错误输出更具信息性,有没有人有更好的解决方案?

编辑:许多 R 调试东西适用于交互式会话。我正在寻找有关通过 Rscript 运行的命令行脚本的帮助。发生错误时,我不在 R 会话的中间,我在 bash shell 中。我无法运行“traceback()”

【问题讨论】:

  • 查看 dump.frames。允许您在批处理脚本失败后对其进行交互式调试。
  • 这个有什么动静吗?我也有同样的挣扎,难以忍受..
  • 我认为这个问题还没有令人满意的答案。

标签: r error-handling


【解决方案1】:

试试这篇文章中的一些建议:

General suggestions for debugging in R

具体来说,findLineNum()traceback()/setBreakpoint()

【讨论】:

  • 这些建议中的大多数与加载交互式 R 和使用 source() 运行脚本有关。在命令行上使用 Rscript 怎么样?我浏览了所有这些建议,但不知道如何打印出行号。它仅在使用 source() 时有效
  • @sheffien 对于交互式使用,options(error=recover)debugonce 可能会有所帮助。
【解决方案2】:

在脚本中获取有关错误发生位置的更多信息的一种方法是将 R 消息重定向到与错误相同的流:

sink(stdout(), type="message") 

通过这种方式,您可以在同一输出中同时获得消息和错误,以便查看哪一行引发了错误...

【讨论】:

    【解决方案3】:

    @Nathan 好吧,在脚本的开头添加这一行sink(stdout(), type="message"),您应该在控制台消息中获得脚本内容和输出以及错误消息,以便您可以在控制台中以交互模式查看它。 (如果您希望保持控制台“干净”,您也可以重定向到日志文件)

    【讨论】:

    • 这实际上对我没有任何改变
    • 这会改变一些应该改回来的东西吗?像“par”吗?
    【解决方案4】:

    看看我的tryCatchLog (https://github.com/aryoda/tryCatchLog)。

    虽然不可能直接改进 R 错误消息,但您可以通过识别错误的确切代码行并将错误发生时的实际变量存储在转储中以进行“事后”分析,从而节省大量时间!

    tryCatchLog 函数相对于tryCatch 的主要优点是

    • 将错误、警告和消息轻松记录到文件或控制台中
    • 警告不会停止程序执行(如果您传递警告处理函数,tryCatch 会停止执行)
    • 通过记录引用源文件名和行号的堆栈跟踪来识别错误和警告的来源(因为回溯不包含完整的堆栈跟踪)
    • 允许通过创建转储文件来进行事后分析,其中包含全局环境(工作区)的所有变量和调用的每个函数(通过 dump.frames) - 对于您的批处理作业非常有帮助无法直接在服务器上调试重现错误!

    【讨论】:

      【解决方案5】:

      这将显示更详细的回溯,但不显示行号:

      options(error = function() {traceback(2, max.lines=100); if(!interactive()) quit(save="no", status=1, runLast=T)})
      

      【讨论】:

        猜你喜欢
        • 2020-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多