Как запустить для l oop в режиме отладки в RStudio? - PullRequest
7 голосов
/ 04 апреля 2020

У меня есть следующий код для получения воспроизводимой ошибки:

cc <- function(){
  a(2)  
}

a <- function(b){

  x <- rep(NA, 3)
  for(nr in 1:3){
    x[nr] <- nr
  }
  a*2

}

cc()

(Обратите внимание, что это примерная ошибка, мне не интересно ее решать. Это лишь минимальный воспроизводимый пример, который позволяет мне есть пример, когда мы попадаем в режим отладки).

Я использую RStudio с настройками отладки: «Взлом в коде» (Отладка - При ошибке - Разрыв в коде).

Во время отладки я хочу запустить для l oop, но я не могу:

> cc()
Error in a * 2 : non-numeric argument to binary operator
Called from: a(2)
Browse[1]> x <- NULL
Browse[1]> for(nr in 1:3){
+     x[nr] <- nr
+   }
debug at #2: x[nr] <- nr
Browse[4]> x
NULL

Вопрос:

Как я могу запустить циклы for, если утверждения, в то время как и др. c. в режиме отладки (и сохранить соответствующие результаты в «среде отладки»)?

(если быть точным, я могу запустить код, как видно из примера выше. Но значение x не меняется ).

Редактировать: Зачем мне это нужно?

Иногда я сталкиваюсь с непредвиденной ошибкой в ​​моем коде и лучше понимаю ее, выполняя sh для выполнения Код до / после этого определяет c «часть ошибки» моего кода. Это прекрасно работает, за исключением того, что результаты запуска for l oop не сохраняются во «Среде временной отладки», как показано в примере.

Таким образом, замена for l oop на sapply или аналогичную не решит его, так как тот же вызов будет иметь место, пока, если, et c.

Что я пробовал:

  • browser() можно установить в течение 1 oop. Но я бы не хотел устанавливать это заранее. Мне также не нужно прерывать в определенной точке этого для l oop?.
  • , используя recover()

Я бы ожидал, что Контент в al oop я не могу получить доступ к дополнительной среде через recover(), ...

Попытка следовать решению Джеймса Керрана:

> debug(cc)
> cc()
debugging in: cc()
debug at
 #1: {
    a(2)
}
Browse[2]> debug(a)
Browse[2]> a(2)
debugging in: a(2)
debug at #1: {
    x <- rep(NA, 3)
    for (nr in 1:3) {
        x[nr] <- nr
    }
    a * 2
}
Browse[4]> x <- rep(NA, 3)
Browse[4]> for(nr in 1:3){
+     x[nr] <- nr
+   }
debug at #2: x[nr] <- nr
Browse[5]> a*2
Error in a * 2 : non-numeric argument to binary operator
Browse[7]> x
[1] NA NA NA

Кажется, я не изменил X, (Надеюсь, я правильно следовал инструкциям).

Ответы [ 2 ]

4 голосов
/ 11 апреля 2020

Как насчет этой попытки?

> debug(a)
> cc()

Таким образом, отладка начинает работать только в функции. ps

0 голосов
/ 05 апреля 2020

Используйте функцию debug в R. Перед вызовом cc выполните

debug(cc)

Затем вызовите cc. Как только вы введете cc в режиме отладки, вы, вероятно, захотите отладить и a, поэтому введите

debug(a)

и продолжайте.

...