在R调试器中显示上下文?

时间:2013-01-30 15:48:10

标签: r debugging

如果我使用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]> 

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

任何提示?

[编辑]我对用例感兴趣(其中包括),我需要弄清楚某人的包裹代码中发生了什么。我不控制源,因此我无法添加browser(),并且我无法轻松访问源文件,因此只需一个行号就没有多大帮助。我主要想看看实际的代码。

2 个答案:

答案 0 :(得分:5)

如果您还设置了options(show.error.locations=TRUE),R将打印包含错误的源行号,例如

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

test.R将是您脚本的名称,#4表示第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的定义(在您提供的示例中在矩阵上调用的方法)和引发错误的调用组成。

答案 1 :(得分:2)

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

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