【问题标题】:Show context in R debugger?在 R 调试器中显示上下文?
【发布时间】:2013-01-30 15:48:10
【问题描述】:

如果我已经使用 options(error=recover) 进入 R 调试器,我如何才能了解我的方位并查看它在哪里丢弃我的代码?例如:

options(error=recover)
solve(matrix(0, nrow=5, ncol=5))

# Error in solve.default(matrix(0, nrow = 5, ncol = 5)) : 
#   Lapack routine dgesv: system is exactly singular: U[1,1] = 0
# 
# Enter a frame number, or 0 to exit   
# 
# 1: solve(matrix(0, nrow = 5, ncol = 5))
# 2: solve.default(matrix(0, nrow = 5, ncol = 5))
# 
# Selection: 1
# Called from: top level 
Browse[1]> 

此时,如果我点击 nreturn,我会再次死去并得到recover 提示符,而看不到任何代码行。如果我进行堆栈跟踪(类型where),我可以看到调用链,但看不到我实际所在的代码(在堆栈的任何级别)。 [实际上我确实在solve 案例中看到了一些代码,但这只是因为一个匿名函数是堆栈的一部分,所以它别无选择,只能打印其定义而不是其名称。]

有什么建议吗?

[编辑] 我(除其他外)对我需要弄清楚某人的包代码中发生了什么的用例感兴趣。我不控制源,所以我无法添加browser(),而且我无法轻松访问源文件,因此仅行号不会有太大帮助。我主要只是想看看实际的代码。

【问题讨论】:

    标签: r debugging


    【解决方案1】:

    如果你还设置了options(show.error.locations=TRUE),R 将打印带有错误的源代码行号,例如

    Error in eval(expr, envir, enclos) (from test.R#4) :
    

    test.R 将是您的脚本名称,#4 表示错误发生在第四行。

    如果您只是使用browser 插入断点,您可以使用browser(text='end of plotting function') 提供一些识别文本,然后在您与browserText() 进行浏览会话时检索此文本以验证您的位置。

    编辑

    如果您想找到在使用已安装函数时遇到错误的位置,标准方法是在函数上调用debug,运行您的代码,然后单步执行,直到遇到错误。有关详细信息,请参阅?debug

    但是,如果您是不耐烦的类型,则可以使用以下技巧来获取将 show.error.locations 设置为 TRUE 时发生错误的已安装函数主体的行号。

    s<-paste(c(capture.output(dump('solve.default', file='')), 
              'solve(matrix(0, nrow=5, ncol=5))'), 
             collapse='\n')
    source(textConnection(s))
    

    这里的s 是一个字符串,由solve.default 的定义(在您提供的示例中在您的矩阵上调用的方法)和引发错误的调用组成。

    【讨论】:

    • 方便,我不知道。但在这种情况下它实际上似乎没有做任何事情,solve 错误的输出在我看来是一样的。
    • 如果你直接在 R 终端中尝试这个,当然不会有源代码行号。我不相信这个选项是在 2.15 之前添加的,它可能是你的版本。
    • 为什么solve 函数没有任何行号信息?我在 R 版本 2.15.2 中运行,你的意思是你得到不同的结果?
    • show.error.locations 显示执行源代码时遇到的错误的行号,而不是已经安装的函数的代码。您可以使用debug 函数,例如debug(solve) 来逐步执行已安装的函数,直到遇到错误。
    【解决方案2】:

    如果你喜欢 Emacs,我知道 ess-tracebug 包通过将光标移动到源代码缓冲区中的当前行来提供此功能。 ess-tracebug 包含在最新版本的 ESS 模式中。

    (如果 OP 不喜欢 Emacs,请不要给我的答案投票:请等待更好的答案。)

    【讨论】:

    • 事实上,我确实喜欢 Emacs。 =)
    • 看起来我需要更多时间来弄清楚如何让 ess-tracebug 工作,但它看起来很棒。我已经在使用 ESS。
    猜你喜欢
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多