R脚本行号错误?

for*_*ait 96 debugging r

如果我从命令行运行一个长R脚本(R --slave script.R),我怎么能让它给出错误的行号?

如果可能的话,我不想将调试命令添加到脚本中 - 我只是希望R的行为与大多数其他脚本语言一样......

Sha*_*ane 41

这不会给你行号,但它会告诉你调用堆栈中发生故障的位置非常有帮助:

traceback()
Run Code Online (Sandbox Code Playgroud)

[编辑:]从命令行运行脚本时,您将不得不跳过一个或两个调用,请参阅traceback()以获取交互式和非交互式R会话

没有通常的调试嫌疑人,我不知道另一种方法可以做到这一点:

  1. 调试()
  2. 浏览器()
  3. 选项(错误=恢复)[后跟选项(错误= NULL)以恢复它]

你可能想看看这篇相关的帖子.

[编辑:]抱歉......刚看到你从命令行运行它.在这种情况下,我建议使用选项(错误)功能.这是一个简单的例子:

options(error = quote({dump.frames(to.file=TRUE); q()}))
Run Code Online (Sandbox Code Playgroud)

您可以根据需要在错误条件下创建精心制作的脚本,因此您应该确定调试所需的信息.

否则,如果您关注的是特定区域(例如,连接到数据库),则将它们包装在tryCatch()函数中.


Hug*_*ins 12

执行options(error=traceback)提供有关导致错误的行内容的更多信息.如果出现错误,它会导致出现回溯,对于某些错误,它会有行号,前缀为#.但它的命中或错过,很多错误都不会得到行号.

  • 不太适合我。我只有一个文件,它没有显示行号,只是在错误后说“没有可用的回溯”。 (2认同)

Dir*_*tel 10

R 2.10及更高版本即将提供对此的支持.Duncan Murdoch于2009年9月10日刚刚发布了关于findLineNum和setBreapoint的 r-devel :

x <- " f <- function(a, b) {
             if (a > b)  {
                 a
             } else {
                 b
             }
         }"


eval(parse(text=x))  # Normally you'd use source() to read a file...

findLineNum("<text>#3")   # <text> is a dummy filename used by
parse(text=)
Run Code Online (Sandbox Code Playgroud)


TMS*_*TMS 6

您可以通过设置

options(show.error.locations = TRUE)
Run Code Online (Sandbox Code Playgroud)

我只是想知道为什么该设置不是R中的默认设置?应该如此,就像其他所有语言一样。

  • 我对此表示怀疑。R核心和RStudio是非常不同的组织,特别是R核心是坚定的开源者。 (6认同)
  • 这曾经有效,但由于不可靠而被禁用。我认为这是试图强迫您使用 RStudio,而 RStudio 最终将是非免费的。 (4认同)
  • 我在 4.1.2 上发现了与 @con 相同的问题。老实说,如果 R 不能获得像这样的简单功能,它可能不应该成为一种大规模流通的语言 (4认同)
  • 这在 R 4.0.2 中不起作用 (2认同)