Ответ 1
Довольно самоочевидный.
repeat{
statements...
if(condition){
break
}
}
Или что-то в этом духе подумал. Чтобы получить эффект цикла do while, просто проверьте свое состояние в конце группы операторов.
Мне было интересно, как писать цикл do-while-style?
Я нашел этот пост:
вы можете использовать repeat {} и проверить условия, в которых используются if() и выйдите из цикла с управляющим словом "break".
Я не уверен, что это значит. Может кто-то прокомментировать, если вы это понимаете, и/или если у вас есть другое решение?
Довольно самоочевидный.
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 для достижения поведения, выполняемого до конца. Используя простую логическую переменную в условии while (инициализируется TRUE), а затем проверяя наше фактическое состояние позже в выражении if. Можно также использовать ключевое слово break вместо продолжения < - FALSE внутри оператора if (вероятно, более эффективно).
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" = "repeat until not"
* Кодовая эквивалентность:
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
Я все еще настаиваю на том, что без отрицания условия в do-while, ответ Salcedo неверен. Это можно проверить, удалив символ отрицания в приведенном выше коде.