Для цикла против Sapply с точки зрения шага ошибки в R - PullRequest
0 голосов
/ 30 августа 2018

У меня возникла проблема при анализе ошибок в sapply в R.

Предположим, у меня есть матрица, как показано ниже,

B <- matrix( 
  c(2, 4, 3, 1, 5, 7), 
  nrow=3, 
  ncol=2)

Просто, чтобы создать некоторые ошибки, я индексирую за пределами матрицы. (i in 1:5 часть)

for (i in 1:5) {

    x <- B[1,i]^2
    if(i==1) {

        result <- x

    }else{

        result <- rbind(result,x)

    }
}

Конечно, выдает такую ​​ошибку.

Error in B[1, i] : subscript out of bounds

Однако не так сложно найти, на каком шаге выдается ошибка. Так как, если я назову i;

> i
[1] 3

Я легко могу понять, на каком этапе я столкнулся с ошибкой. В этом случае это происходит, когда i=3.

Однако, чтобы воспользоваться скоростью функции sapply в R (поскольку петли не рекомендуются из-за отсутствия скорости), я использовал ее, как показано ниже;

sapply(1:5 ,function(j) {

       y <- B[1,j]^2

})

Не удивительно, что выдает ту же ошибку.

Error in B[1, j] : subscript out of bounds

Однако теперь я не вижу, на каком этапе я потерпел неудачу. Поскольку ни j, ни y не записано!

> j
Error: object 'j' not found
> y 
Error: object 'y' not found

Что вы можете предложить по этому поводу? Я знаю, что это простой пример. Но вещи, с которыми я имею дело в действительности, являются более сложными, и становится все труднее найти шаг ошибки.

Заранее спасибо!

1 Ответ

0 голосов
/ 30 августа 2018

Если вы используете RStudio, самый простой способ - это активировать в меню: Отладка> При ошибке> Взлом кода.

Это откроет браузер при ошибке, и вы сможете увидеть значение j.

Если вы не используете RStudio, вы можете установить options(error = recover), что также приведет к открытию браузера при ошибке. (В вашем конкретном случае выберите кадр 3, и вы сможете увидеть значение j)

...