【问题标题】:do-while loop in RR中的do-while循环
【发布时间】:2011-05-20 11:02:06
【问题描述】:

我想知道如何编写 do-while 样式的循环?

我找到this post

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

我不确定它的确切含义。如果您理解它和/或如果您有不同的解决方案,有人可以详细说明吗?

【问题讨论】:

  • @Jericho 和@DWin 的答案之间的区别在于“陈述”是否得到评估。在@Jericho 的回答中,循环至少运行一次,因为中断条件出现在“语句”之后。在@DWin 的回答中,如果y 开始时大于或等于5,则循环根本不会运行。您更喜欢哪种取决于您是否希望“语句”运行。
  • 总之,do while 语句至少运行一次,然后在循环回语句之前检查条件。
  • 因此,如果您通过在循环之前将条件设置为 true 来确保循环(语句)至少运行一次(例如,带有一个临时变量和一个或连接的或),如 Dwin 的回答)。

标签: r loops repeat do-while r-faq


【解决方案1】:

非常不言自明。

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

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

【讨论】:

  • 这比使用while快吗?
  • a while 和 do while 用于不同的情况。就这样考虑吧,while -> 0 表示多次执行,do-while 1 表示多次执行。我不会认为它更快或更慢,只是有时您希望至少执行一次,而有些则不想执行。无非是条件的放置。
  • 对我来说,42 的答案是正确的,而 Salcedo 的答案是错误的。在 42 的回答中,条件中有一个 NEGATION (repeat( { expressions}; if (! end_cond_expr ) {break} ))。所以,do-while EndCondition 是通过重复 !EndCondition 来模拟的。我通过代码 sn-p 检查了这个事实。
  • @ErdoganCEVHER OP 没有定义 condition 的含义,所以我不会称 Salcedo 的答案为假。但是你有一个很好的观点 if(!condition){break} 与 C 的 do{} while(condition) 对齐更好。
【解决方案2】:

参见?ControlR Language Definition:

> 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”,而不是请求的“do-while”。关键是 do-while 设置将让您在一个地方编写一些命令(不在循环块内外重复)并保证预期的函数被调用一次。就像这里的答案一样,您会看到有两行为y 分配了一个值(在第一行以及print 调用中。为了减少冗余并减少某些情况下的错误,这样做很好-while 所以你只分配一些变量(例如y)一次。
  • 请原谅我的迟钝,但是你写的东西是不透明的,没有代码示例来说明。
  • 关键是何时(以及如何)执行终止条件。在 do-while-loops 中,在进行每次迭代之前都会测试条件是否为真,而在 repeat-until-loops 中,测试是在迭代结束时进行的,并在看到 TRUE 值时退出。
  • 我刚刚注意到这个答案的第二次投反对票。我猜(这是我所能做的,因为到目前为止的一个异议对我来说毫无意义)还有其他语言(除了 R 和 Pascal),这种区别更重要(并且与 R 不同)。 repeat-until 和 do-while 结构在 R 编程中有些不寻常,因此其他语言中的细微之处对我们用户来说可能并不明显。
  • 与语言的差异无关,是控制流的差异。 do-while 表示:运行这段代码一次。检查状况。如果条件为假,请再次运行此代码块。重复检查条件。 while 表示:检查条件。运行这段代码。如果条件为假,请再次运行此代码块。重复检查条件。在do-while 循环中,代码执行后检查条件。在while 循环中,before 对其进行了检查。在do-while 循环中,保证代码至少执行一次。在while 循环中,代码可能永远不会被执行。
【解决方案3】:

在其他答案的基础上,我想分享一个使用 while 循环结构来实现 do-while 行为的示例。通过在 while 条件中使用一个简单的布尔变量(初始化为 TRUE),然后稍后在 if 语句中检查我们的实际条件。也可以在 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
    }
  }

【讨论】:

    【解决方案4】:

    注意到用户 42- 的完美方法{
    *“做而”=“重复直到不”
    * 代码等价:

    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 的答案是错误的。可以通过删除上述代码中的否定符号来检查这一点。

    【讨论】:

    • 我认为您误解了 Salcedo 的回答。它在伪代码中没有明确的条件。你可以用!(y&lt;5) 替换他的(condition),或者你可以用(y&gt;=5) 或任何你需要的用例替换它。它不必有一个否定符号,它只是你需要的逻辑条件来停止循环。
    • 不,我没有误会。我强调的是,必须使用 do-while 中指定条件的“否定”。 Math'ly、!(y&lt;5)(y&gt;=5) 是等价的。两者都是(y&lt;5)的否定。我不坚持使用“!”否定符号。可以将否定符号分配给手中的短语,就像!(y&lt;5) = (y&gt;=5)
    猜你喜欢
    • 2012-01-30
    • 2016-07-01
    • 2018-05-09
    • 2015-07-03
    • 2016-02-21
    • 2020-11-26
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    相关资源
    最近更新 更多