我观察到关于traceback()
的交互式和非交互式R session 之间的区别,我不理解。对于下面的代码,它将产生一个错误,但是在交互式R session 中,我可以看到回溯信息,而如果我将代码保存到test.R
并通过Rscript test.R
或R -f test.R
调用它,我将不再看到回溯:
f = function() {
on.exit(traceback())
1 + 'a'
}
f()
在交互式R session 中:
> 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 session 启用回溯。谢谢! 最佳答案
使用其参数的默认值,traceback()
将在.Traceback
中寻找一个名为baseenv()
的对象,以获取有关调用堆栈的信息。 (从src/main/errors.c
)看起来像.Traceback
仅在以下条件下才创建:R_Interactive || haveHandler
,这表明在非交互式 session 期间未创建此对象。如果没有名为.Traceback
的对象,则会收到消息“没有可用的追溯”。
但是,通过将一个非NULL值传递给x
的traceback()
参数,可以从非交互式 session 中获取有关调用堆栈的信息。使用非零整数值(指示要在堆栈中跳过的调用数),将调用c级函数(R_GetTraceback
)以调查调用堆栈,而不是查找.Traceback
。
因此,有两种方法可以在非交互式 session 中获取回溯信息:
f = function() {
on.exit(traceback(1))
1 + 'a'
}
f()
或者,将
options
设置为Brandon Bertelsen建议options(error=function()traceback(2))
在两个示例中传递给
x
的不同值说明了要跳过的函数数量不同on.exit
示例中,traceback(1)
跳过对traceback()
的调用。 options
中,有一个额外的匿名函数调用traceback()
,该函数也应该/也可以被跳过。 在OP中的示例中,与在非交互式 session 中发生错误的情况下提供的自动回溯相比,使用
traceback()
不会获得更多的信息。但是,对于带有(并传递)自变量的函数,使用traceback()
比在非交互式 session 中调用堆栈的标准表示要有用得多。关于r - 交互式和非交互式R session 的traceback(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13116099/