цикл "сделай пока" в R - PullRequest
       22

цикл "сделай пока" в R

55 голосов
/ 05 декабря 2010

Мне было интересно, как написать цикл в стиле do-while?

Я нашел этот пост :

, вы можете использовать repeat {} ипроверяйте условия везде, используя if (), и выходите из цикла с управляющим словом «break».

Я не уверен, что именно это означает.Может кто-нибудь уточнить, если вы понимаете это и / или если у вас есть другое решение?

Ответы [ 4 ]

97 голосов
/ 05 декабря 2010

Довольно понятно.

repeat{
  statements...
  if(condition){
    break
  }
}

Или что-то подобное, я бы подумал. Чтобы получить эффект цикла do while, просто проверьте свое состояние в конце группы операторов.

21 голосов
/ 05 декабря 2010

См. ?Control или определение языка R:

> y=0
> while(y <5){ print( y<-y+1) }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5

Так что do_while не существует как отдельная конструкция в R, но вы можете подделать ее с помощью:

repeat( { expressions}; if (! end_cond_expr ) {break} )

Если вы хотите увидеть страницу справки, вы не можете набрать ?while или ?repeat на консоли, а вместо этого должны использовать ?'repeat' или ?'while'.Все «управляющие конструкции», включая if, находятся на одной и той же странице, и все нуждаются в цитировании символов после «?»поэтому интерпретатор не видит их как неполный код и дает вам продолжение "+".

5 голосов
/ 06 марта 2016

Основываясь на других ответах, я хотел бы поделиться примером использования конструкции цикла while для достижения поведения «сделай пока». Используя простую логическую переменную в условии while (инициализируется в TRUE), а затем проверяя наше действительное условие позже в операторе if Можно также использовать ключевое слово break вместо continue <- FALSE внутри оператора if (возможно, более эффективно). </p>

  df <- data.frame(X=c(), R=c())  
  x <- x0
  continue <- TRUE

  while(continue)
  {
    xi <- (11 * x) %% 16
    df <- rbind(df, data.frame(X=x, R=xi))
    x <- xi

    if(xi == x0)
    {
      continue <- FALSE
    }
  }
0 голосов
/ 17 июня 2017

Заметив, что для пользователя 42-х идеальный подход {
* "делать пока" = "повторять до тех пор, пока"
* Эквивалентность кода:

do while (condition) # in other language
..statements..
endo

repeat{ # in R
  ..statements..
  if(! condition){ break } # Negation is crucial here!
}

} не получил достаточного внимания со стороны других, я подчеркну и изложу его подход на конкретном примере.Если человек не отменяет условие в do-while (через ! или принимая отрицание), то существуют искаженные ситуации (1. постоянство значений 2. бесконечный цикл) в зависимости от хода кода.

В Гауссе:

proc(0)=printvalues(y);
DO WHILE y < 5;    
y+1;
 y=y+1;
ENDO;
ENDP;
printvalues(0); @ run selected code via F4 to get the following @
       1.0000000 
       2.0000000 
       3.0000000 
       4.0000000 
       5.0000000 

В R:

printvalues <- function(y) {
repeat {
 y=y+1;
print(y)
if (! (y < 5) ) {break}   # Negation is crucial here!
}
}
printvalues(0)
# [1] 1
# [1] 2
# [1] 3
# [1] 4
# [1] 5

I все еще настаивают на том, что без отрицания условия в do-while ответ Сальседо неверен.Это можно проверить, удалив символ отрицания в приведенном выше коде.

...