首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >交互式和非交互式R会话的traceback()

交互式和非交互式R会话的traceback()
EN

Stack Overflow用户
提问于 2012-10-29 13:02:27
回答 4查看 5.4K关注 0票数 32

我观察到关于traceback()的交互式和非交互式R会话之间的不同之处,这是我不理解的。对于下面的代码,它将产生一个错误,但在交互式R会话中,我可以看到回溯信息,而如果我将代码保存到test.R并通过Rscript test.RR -f test.R调用它,我就看不到回溯了:

代码语言:javascript
复制
f = function() {
  on.exit(traceback())
  1 + 'a'
}
f()

在交互式R会话中:

代码语言:javascript
复制
> f = function() {
+   on.exit(traceback())
+   1 + 'a'
+ }
> f()
Error in 1 + "a" : non-numeric argument to binary operator
1: f()

非交互执行:

代码语言:javascript
复制
$ Rscript test.R 
Error in 1 + "a" : non-numeric argument to binary operator
Calls: f
No traceback available 
Execution halted

我在?traceback中没有看到解释,我想知道是否有一种方法可以为非交互式R会话启用回溯。谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-29 17:58:38

使用其参数的默认值,traceback()将在baseenv()中查找名为.Traceback的对象,以获取有关调用堆栈的信息。(从src/main/errors.c)看起来,只有在满足R_Interactive || haveHandler等条件的情况下才会创建.Traceback,这表明此对象不是在非交互式会话期间创建的。如果没有名为.Traceback的对象,您将收到消息"No traceback available“。

但是,通过将非空值传递给traceback()x参数,可以从非交互式会话获得有关调用堆栈的信息。使用非零整数值(指示堆栈中要跳过的调用数)时,将调用c级函数(R_GetTraceback)来调查调用堆栈,而不是查看.Traceback

因此,有几种方法可以在非交互式会话中获取回溯信息:

代码语言:javascript
复制
f = function() {
  on.exit(traceback(1))
  1 + 'a'
}
f()

或者,按照Brandon Bertelsen的建议设置options

代码语言:javascript
复制
options(error=function()traceback(2))

在这两个示例中传递给x的不同值说明了要跳过的函数的不同数量

  1. on.exit示例中,traceback(1)跳过了对示例设置options的调用,还有一个额外的匿名函数调用traceback(),该函数应该/也可以被跳过。

在OP中的示例中,与在非交互式会话中出现错误时提供的自动回溯相比,使用traceback()获得的信息并不多。但是,对于接受(并传递)参数的函数,在非交互式会话中使用traceback()将比调用堆栈的标准表示形式提供更多的信息。

票数 32
EN

Stack Overflow用户

发布于 2016-09-21 15:04:36

还可以转储调试信息,并在以后加载它们。(请参阅good ?debugger帮助页面和该主题的评论)

通过以下方式:

代码语言:javascript
复制
options(error = quote(dump.frames("testdump", TRUE)))

..。

代码语言:javascript
复制
load("testdump.rda")
debugger(testdump)

代码语言:javascript
复制
options(error = quote({dump.frames(to.file = TRUE); q(status = 1)}))
票数 3
EN

Stack Overflow用户

发布于 2020-10-14 20:20:32

BenBarnes的回答和dshepherd的评论都是救命稻草,我会再加一个参数,以避免其中一个参数太大的情况下阻塞屏幕。

代码语言:javascript
复制
options(error=function(){traceback(2,max.lines=3);if(!interactive())quit("no",status=1,runLast=FALSE)})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13116099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档