7

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

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]> 

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

有小费吗?

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

4

2 回答 2

5

如果您还设置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(在您提供的示例中在您的矩阵上调用的方法)的定义和引发错误的调用组成。

于 2013-01-30T15:55:04.920 回答
2

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

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

于 2013-01-30T17:19:31.913 回答