在 R 中循环 do-while

我想知道如何编写 do-while 风格的循环?

我找到了 这篇文章:

您可以使用 repeat {}并在任何地方使用 if ()和 用“ break”控制词退出循环。

我不知道这到底是什么意思。有没有人可以详细说明一下,如果你理解它和/或如果你有一个不同的解决方案?

169410 次浏览

不言而喻。

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

或者类似的东西。要获得 do while 循环的效果,只需在语句组的末尾检查您的条件。

请参阅 ?Control语言定义:

> 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 语句中检查我们的实际条件。还可以在 if 语句中使用 break 关键字,而不是 keep <-FALSE (可能效率更高)。

  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。无限循环)存在,这取决于代码的进程。

在 Gauss:

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

还是坚持认为,没有否定的条件在做-而,萨尔塞多的答案是错误的。可以通过删除上述代码中的否定符号来检查这一点。