R中的do-while循环

Tim*_*Tim 56 loops r repeat do-while

我想知道如何编写do-while-style循环?

我发现这篇文章:

您可以使用repeat {}并检查使用if()的条件,并使用"break"控制字退出循环.

我不确定它究竟意味着什么.如果你了解它和/或你有不同的解决方案,有人可以详细说明吗?

A S*_*edo 104

非常自我解释.

repeat{
  statements...
  if(condition){
    break
  }
}
Run Code Online (Sandbox Code Playgroud)

或者像我想的那样.要获得do while循环的效果,只需在语句组的末尾检查您的条件.

  • 一会儿和一会儿分别用于不同的情况。只是这样考虑,-> 0至多次执行,而1至多次执行。我不会认为它更快或更慢,只是有时候您想要执行至少一次,而有些则不需要。它只不过是条件的位置。 (2认同)
  • 对我来说,42的回答是正确的,而Salcedo的回答是错误的.在42的回答中,条件中有一个NEGATION(`repeat({expressions}; if(!end_cond_expr){break})`).所以,do-while EndCondition是通过repeat!EndCondition来模拟的.我通过代码片段检查了这个事实. (2认同)

42-*_*42- 24

请参阅?ControlR语言定义:

> y=0
> while(y <5){ print( y<-y+1) }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
Run Code Online (Sandbox Code Playgroud)

因此do_while不存在作为R中的单独构造,但您可以伪造它:

repeat( { expressions}; if (! end_cond_expr ) {break} )
Run Code Online (Sandbox Code Playgroud)

如果您想要查看帮助页面,则无法键入?while?repeat在控制台上,而是需要使用?'repeat'?'while'.所有"控制结构"包含if在同一页面上,并且都需要在"?"之后引用字符.因此,解释器不会将它们视为不完整的代码,并为您提供继续"+".

  • 这是"while-do",而非请求的"do-while".重点是do-while设置将允许您在一个地方编写一些命令(不在循环块的外部和内部重复)并保证预期的函数被调用一次.正如在这里的答案中,你看到有两行为`y`赋值(在第一行和`print`调用中.为了减少冗余并减少某些情况下的错误,这样做很好 - 所以你只分配一些变量(例如`y`)一次. (3认同)

小智 6

基于其他答案,我想分享一个使用while循环结构来实现do-while行为的示例.通过在while条件中使用一个简单的布尔变量(初始化为TRUE),然后在if语句中检查我们的实际条件.也可以在if语句中使用break关键字而不是continue < - 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
    }
  }
Run Code Online (Sandbox Code Playgroud)