我观察到关于traceback()的交互式和非交互式R会话之间的不同之处,这是我不理解的。对于下面的代码,它将产生一个错误,但在交互式R会话中,我可以看到回溯信息,而如果我将代码保存到test.R并通过Rscript test.R或R -f test.R调用它,我就看不到回溯了:
f = function() {
on.exit(traceback())
1 + 'a'
}
f()在交互式R会话中:
> f = function() {
+ on.exit(traceback())
+ 1 + 'a'
+ }
> f()
Error in 1 + "a" : non-numeric argument to binary operator
1: f()非交互执行:
$ Rscript test.R
Error in 1 + "a" : non-numeric argument to binary operator
Calls: f
No traceback available
Execution halted我在?traceback中没有看到解释,我想知道是否有一种方法可以为非交互式R会话启用回溯。谢谢!
发布于 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。
因此,有几种方法可以在非交互式会话中获取回溯信息:
f = function() {
on.exit(traceback(1))
1 + 'a'
}
f()或者,按照Brandon Bertelsen的建议设置options
options(error=function()traceback(2))在这两个示例中传递给x的不同值说明了要跳过的函数的不同数量
on.exit示例中,traceback(1)跳过了对示例设置options的调用,还有一个额外的匿名函数调用traceback(),该函数应该/也可以被跳过。在OP中的示例中,与在非交互式会话中出现错误时提供的自动回溯相比,使用traceback()获得的信息并不多。但是,对于接受(并传递)参数的函数,在非交互式会话中使用traceback()将比调用堆栈的标准表示形式提供更多的信息。
发布于 2016-09-21 15:04:36
还可以转储调试信息,并在以后加载它们。(请参阅good ?debugger帮助页面和该主题的评论)
通过以下方式:
options(error = quote(dump.frames("testdump", TRUE)))..。
load("testdump.rda")
debugger(testdump)或
options(error = quote({dump.frames(to.file = TRUE); q(status = 1)}))发布于 2020-10-14 20:20:32
BenBarnes的回答和dshepherd的评论都是救命稻草,我会再加一个参数,以避免其中一个参数太大的情况下阻塞屏幕。
options(error=function(){traceback(2,max.lines=3);if(!interactive())quit("no",status=1,runLast=FALSE)})https://stackoverflow.com/questions/13116099
复制相似问题