цикл do-while в R


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

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

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

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

4   51  

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 (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 ответ Сальседо неверен. Это можно проверить, удалив символ отрицания в приведенном выше коде.