Ответ 1
Со значениями по умолчанию для своих аргументов traceback()
будет искать объект с именем .Traceback
в baseenv()
для информации о стеке вызовов. Он выглядит (от src/main/errors.c
), как .Traceback
, создается только в том случае, если среди прочих условий R_Interactive || haveHandler
, предполагая, что этот объект не создается во время неинтерактивных сеансов. Если нет объекта с именем .Traceback
, вы получите сообщение "Нет возможности отслеживания".
Однако, передав значение non-NULL аргументу x
traceback()
, можно получить информацию о стеке вызовов из неинтерактивного сеанса. С ненулевым целочисленным значением (с указанием количества вызовов, которые нужно пропустить в стеке) вызываются функции c-level (R_GetTraceback
), чтобы исследовать стек вызовов вместо поиска в .Traceback
.
Итак, есть несколько способов получить информацию о трассировке в неинтерактивном сеансе:
f = function() {
on.exit(traceback(1))
1 + 'a'
}
f()
Или, установив options
, как предложил Брэндон Бертельсен
options(error=function()traceback(2))
Различные значения, переданные в x
в двух примерах, учитывают различное количество функций для пропуска
-
В примере
on.exit
traceback(1)
пропускает вызовtraceback()
. -
В примере установки
options
есть дополнительная анонимная функция, которая вызываетtraceback()
, которая должна/также быть пропущена.
В примере в OP не так много информации получено при использовании traceback()
по сравнению с автоматической трассировкой, предоставленной в случае ошибки в неинтерактивном сеансе. Однако с функциями, которые принимают (и передаются) аргументы, использование traceback()
будет гораздо более информативным, чем стандартное представление стека вызовов в неинтерактивном сеансе.