如果我通过使用进入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]>
Run Code Online (Sandbox Code Playgroud)
此时,如果我点击n或者return,我只是再次死亡并得到recover提示,而没有看到任何代码行.如果我进行堆栈跟踪(类型where),我可以看到调用链,但不是我实际所在的代码(在堆栈的任何级别). [实际上我确实在这种solve情况下看到了一些代码,但只是因为一个匿名函数是堆栈的一部分所以它除了打印它的定义而不是它的名字之外别无选择.
有小费吗?
[编辑]我对用例感兴趣(其中包括),我需要弄清楚某人的包裹代码中发生了什么.我不控制源,所以我不能添加一个browser(),我没有轻松访问源文件,所以只是一个行号不会有太大的帮助.我主要只是想看看实际的代码.
如果您也设置了options(show.error.locations=TRUE),R将打印带有错误的源行号,例如
Error in eval(expr, envir, enclos) (from test.R#4) :
Run Code Online (Sandbox Code Playgroud)
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))
Run Code Online (Sandbox Code Playgroud)
这s是一个字符串,包含solve.default(在您提供的示例中在矩阵上调用的方法)的定义,以及引发错误的调用.
如果您喜欢 Emacs,我知道 ess-tracebug 包通过将光标移动到源代码缓冲区中的当前行来提供此功能。ess-tracebug 包含在最新版本的 ESS 模式中。
(如果 OP 不喜欢 Emacs,请不要投票赞成我的答案:请等待更好的答案。)
| 归档时间: |
|
| 查看次数: |
392 次 |
| 最近记录: |