我观察到关于traceback()的交互式和非交互式R session 之间的区别,我不理解。对于下面的代码,它将产生一个错误,但是在交互式R session 中,我可以看到回溯信息,而如果我将代码保存到test.R并通过Rscript test.RR -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值传递给xtraceback()参数,可以从非交互式 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/

    10-12 17:39