你能让R打印更详细的错误信息吗?

时间:2011-09-20 12:56:33

标签: r error-handling

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

最近,我的R脚本失败了,发出了令人难以置信的深刻信息:“执行停止了。”我通常跟踪这些错误的方法是在整个脚本中放入大量的打印语句 - 但这很痛苦。我有时不得不在交互式会话中逐行浏览脚本以找到错误。

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

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

5 个答案:

答案 0 :(得分:8)

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

General suggestions for debugging in R

具体而言,findLineNum()traceback() / setBreakpoint()

答案 1 :(得分:1)

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

答案 2 :(得分:0)

查看我的tryCatchLoghttps://github.com/aryoda/tryCatchLog)。

虽然无法直接改进R错误消息,但您可以通过识别错误的确切代码行来节省大量时间,并在错误发生时将实际变量存储在转储中,以便发布" post验"分析!

tryCatchLog功能优于tryCatch的主要优点是

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:-1)

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

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

这样,您可以在同一输出中同时获得消息和错误,这样您就可以看到哪一行引发了错误...