Ответ 1
Вы можете использовать traceback()
, чтобы найти, где произошла последняя ошибка. Обычно это укажет на вызов, который вы выполняете в своей функции. Затем я обычно кладу browser()
в эту точку, снова запускаю функцию и вижу, что происходит неправильно.
Например, здесь представлены две функции:
f2 <- function(x)
{
if (x==1) "foo"
}
f <- function(x)
{
f2(x)
}
Обратите внимание, что f2()
принимает аргумент длины 1
. Мы можем злоупотреблять f
:
> f(NULL)
Error in if (x == 1) "foo" : argument is of length zero
Теперь мы можем использовать traceback()
, чтобы найти то, что пошло не так:
> traceback()
2: f2(x) at #3
1: f(NULL)
Число означает, насколько мы глубоко вложенные функции. Итак, мы видим, что f
вызывает f2
, и это дает ошибку в строке 3
. Довольно ясно. Мы могли бы переназначить f
с помощью browser
, помещенного непосредственно перед вызовом f2
, чтобы проверить его ввод. browser()
просто позволяет вам прекратить выполнение функции и осмотреть ее среду. Подобно debug
и debugonce
, за исключением того, что вам не нужно выполнять каждую строку до тех пор, пока вы не узнаете, что что-то пошло не так.