цикл do-while в R

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

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

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

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

4 ответов


довольно понятны.

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

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


посмотреть ?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 находятся на одной странице и все нуждаются в цитировании символов после "?- значит, переводчик не видит в них неполный код и дать вам продолжение "+".


основываясь на других ответах, я хотел поделиться примером использования конструкции цикла while для достижения поведения do-while. Используя простую логическую переменную в условии while (инициализировано TRUE), а затем проверяя наше фактическое состояние позже в операторе if. Можно также использовать ключевое слово break вместо continue

  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
    }
  }

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

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

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

} не получил достаточного внимания от других, подчеркну и приведу его подход на конкретном примере. Если не отрицать условие в do-while (via ! или принимая отрицание), затем искаженные ситуации (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

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