在R调试器中显示上下文?
如果我通过使用在R调试器中显示上下文?,r,debugging,R,Debugging,如果我通过使用选项(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 # #
选项(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或return,我只会再次死掉并得到recover
提示,而不会看到任何代码行。如果我进行堆栈跟踪(键入where
),我可以看到调用链,但看不到我实际所在的代码(在堆栈的任何级别)。[实际上,我确实在这个solve
案例中看到了一些代码,但这只是因为一个匿名函数是堆栈的一部分,所以它别无选择,只能打印其定义而不是名称。]
有什么建议吗
[编辑]我对需要了解某人的包代码中发生了什么的用例很感兴趣。我无法控制源代码,因此无法添加
browser()
,并且无法轻松访问源文件,因此仅输入行号没有多大帮助。我主要想看看实际的代码。如果您还设置了选项(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
,运行代码,然后逐步执行,直到遇到错误。有关详细信息,请参阅调试
但是,如果您是不耐烦的类型,则可以使用以下技巧获取在
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如果您喜欢Emacs,我知道ess tracebug包通过将光标移动到源代码缓冲区中的当前行来提供此功能。ess tracebug包含在最新版本的ess模式中
(如果OP不喜欢Emacs,不要投票支持我的答案:请等待更好的答案。)Handy,我不知道。但在这种情况下,它实际上似乎没有任何作用,solve
错误的输出在我看来是一样的。如果您直接在R终端中尝试,当然不会有源行号。我不相信这个选项是在2.15之前添加的,它可能是您的版本。为什么solve
函数没有任何行号信息?我运行的是R版本2.15.2,您的意思是得到不同的结果?show.error.locations
显示执行源代码时遇到的错误行号,而不是已安装的函数代码。您可以使用debug
函数,例如debug(solve)
逐步执行已安装的函数,直到遇到错误。事实上,我非常喜欢Emacs。=)看起来我需要更多的时间来弄清楚如何让ess tracebug工作,但看起来很棒。我已经在用ESS了。