Как работает разрыв во внутреннем l oop в R? - PullRequest
0 голосов
/ 28 марта 2020
while (statement 1){
  ......
  ......
  if (statement 2){
    x <- x + 1
    break
  }
  if (statement 3){
    y <- y + 1
  }
}

У меня есть псевдокод, как показано выше, я хочу проверить мое понимание правильности или нет. Это когда statement 2 выполнено, уравнение в 1-м if loop все еще будет выполняться, тогда оно сломает if loop и никогда не вернется снова, даже если while loop все еще продолжается?

Я ищу объяснение функции прерывания в этом сценарии.

Ответы [ 2 ]

2 голосов
/ 28 марта 2020

Короче говоря, break останавливает l oop в том месте, в котором вы его пишете, без запуска любого из следующего кода. Вы можете проверить это, написав несколько простых утверждений и определив x и y. message - это полезная функция, так как вы можете проверить, какая часть кода все еще выполняется.

x <- 1
y <- 1

while (x < 100){
  if (x == 1){
    x <- x + 1
    break
  }
  message(x)
  if (y < 100){
    y <- y + 1
  }
  message(y)
}

В этом примере первый запуск уже прерван, поскольку x == 1 истинно с самого начала. Вы заметите, что сообщение не печатается, но значение x сейчас равно 2.

Во втором примере я составил утверждение, которое станет верным после нескольких итераций. Сообщения со значениями x и y теперь печатаются для каждой итерации, но после y > 10 ничего не печатается и l oop немедленно останавливается.

x <- 1
y <- 1

while (x < 100){
  if (y > 10){
    x <- x + 1
    break
  }
  message(x)
  if (y < 100){
    y <- y + 1
  }
  message(y)
}

Разница break по сравнению с stop, например, это то, что он будет прерывать только самый внутренний l oop (и что stop выводит сообщение об остановке / ошибке). Это означает, что если ваш код находится в другом l oop, то этот внешний l oop продолжится. Например:

for (x in 1:10) {
  y <- 1
  while (x < 100){
    if (y > 10){
      x <- x + 1
      break
    }
    message(x)
    if (y < 100){
      y <- y + 1
    }
    message(y)
  }
}
1 голос
/ 28 марта 2020

Вы можете проверить, как это работает, с помощью этого простого примера:

num <- 2
x <- 0
y<- 0

while (TRUE){
   if (num %% 10 == 0){
     cat('\nprinting from 1: ', num)
      x <- x + 1
      break
    }
   if (num %% 2 == 0){
     cat('\nprinting from 2: ', num)
     y <- y+ 1
   }
   num <- num + 1
}


#printing from 2:  2
#printing from 2:  4
#printing from 2:  6
#printing from 2:  8
#printing from 1:  10

x
#[1] 1
y
#[1] 4

while(TRUE) заставляет его работать бесконечно долго. Каждый раз, когда num делится на 2 y, увеличивается, а когда num делится на 10, увеличивается y и while l oop прерывается.

...