R中的do-while循环

Posted

技术标签:

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

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

我找到this post:

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

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

【问题讨论】:

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

参见?Control 或R 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)

以上是关于R中的do-while循环的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中的每个 do-while 循环实例上存储数据?

while和do-while的区别

[译]Javascript中的do-while循环

c语言中的do-while循环怎么用啊?给个例子呗。

do-while循环结构

do-while循环结构