Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R调试器中显示上下文?_R_Debugging - Fatal编程技术网

在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了。