Подтвердить что ты не робот

Как найти, где произошла ошибка R?

Иногда R бросает мне такие ошибки, как

Ошибка в if (ncol (x)!= 2) {: аргумент имеет длину 0

без дополнительной информации, когда я не написал такой код. Есть ли общий способ для поиска какой функции, в которой пакет вызывает ошибку?

Поскольку большинство пакетов сжимаются, это не тривиально для grep /usr/lib/R/library.

4b9b3361

Ответ 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, за исключением того, что вам не нужно выполнять каждую строку до тех пор, пока вы не узнаете, что что-то пошло не так.

Ответ 2

Чтобы добавить к тому, что уже предлагал @SachaEpskamp, ​​настройка options(error=recover) и options(show.error.locations=TRUE) может быть чрезвычайно полезна при отладке незнакомого кода. Первое приводит к тому, что R запускает сеанс отладки при ошибке, предоставляя вам возможность вызывать браузер в любой точке стека вызовов до этой ошибки. Вторая опция сообщит R, чтобы указать номер строки источника в ошибке.