проблема с "взломами" для петель в R - PullRequest
1 голос
/ 06 октября 2019

Я пишу язык для курса по аналитике, где меня просят проверить наличие дублирующих элементов в векторе. Хотя я могу кодировать логику, я пытаюсь использовать в коде «разрывы», чтобы после обнаружения дубликата он не проходил по остальным элементам. В моем коде я могу выйти из цикла while, но не из цикла for. Я мог бы использовать совет о том, как добавить второй разрыв, чтобы счетчик остановился на 3 в приведенном ниже, и не возвращался в цикл for.

x <- c(3, -7, 6, 3, 1, -7)
n <- length(x); n # = 6
counter <- 0
answer <- FALSE
for (i in 1:(n-1)) {
    v <- i + 1
    while (v <= n) {
      counter <- counter + 1
      if (x[i] == x[v]) {
        answer <- TRUE
        break
      }
      else {
        v <- v + 1
      }
    }
}
answer # = TRUE
counter # = 13, SHOULD BE 3

Я ожидаю остановиться на 3 циклах, но разрывы, добавленные после скобок, не сработали, поэтому я только успешно добавил разрыв в цикл while, но он все еще проходитостальные элементы.

1 Ответ

0 голосов
/ 06 октября 2019

Поскольку answer не может быть истинным, если цикл while не прерван, поставьте проверку значения answer после цикла while и прервите цикл for, если answer истинно:

x <- c(3, -7, 6, 3, 1, -7)
n <- length(x); n # = 6
counter <- 0
answer <- FALSE
for (i in 1:(n-1)) {
    v <- i + 1
    while (v <= n) {
      counter <- counter + 1
      if (x[i] == x[v]) {
        answer <- TRUE
        break
      }
      else {
        v <- v + 1
      }

    } #end while

    if(answer == TRUE)         
       break

} #end for
answer # = TRUE
counter # = 13, SHOULD BE 3
...