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