我经常对R的神秘错误消息感到沮丧。我不是在交互式会话期间谈论,我的意思是当你运行脚本时。错误消息不会打印出行号,并且通常很难跟踪违规行以及错误原因(即使您可以找到该位置)。
最近,我的R脚本失败了,发出了令人难以置信的深刻信息:“执行停止了。”我通常跟踪这些错误的方法是在整个脚本中放入大量的打印语句 - 但这很痛苦。我有时不得不在交互式会话中逐行浏览脚本以找到错误。
对于如何使R错误输出更具信息性,有没有人有更好的解决方案?
编辑:许多R调试工作适用于交互式会话。我正在寻找有关通过Rscript运行的命令行脚本的帮助。当错误发生时,我不在R会话的中间,我在bash shell。我无法运行“traceback()”
答案 0 :(得分:8)
尝试一下这篇文章中的一些建议:
General suggestions for debugging in R
具体而言,findLineNum()
和traceback()
/ setBreakpoint()
。
答案 1 :(得分:1)
@Nathan在脚本开头添加此行sink(stdout(), type="message")
,您应该在控制台消息中获取脚本内容和输出以及错误消息,以便您可以在控制台中以交互模式查看它。 (如果您希望保持控制台“干净”,您也可以重定向到日志文件)
答案 2 :(得分:0)
查看我的包tryCatchLog
(https://github.com/aryoda/tryCatchLog)。
虽然无法直接改进R错误消息,但您可以通过识别错误的确切代码行来节省大量时间,并在错误发生时将实际变量存储在转储中,以便发布" post验"分析!
tryCatchLog
功能优于tryCatch
的主要优点是
答案 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")
这样,您可以在同一输出中同时获得消息和错误,这样您就可以看到哪一行引发了错误...