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<5)
替换他的(condition)
,或者你可以用(y>=5)
或任何你需要的用例替换它。它不必有一个否定符号,它只是你需要的逻辑条件来停止循环。
不,我没有误会。我强调的是,必须使用 do-while 中指定条件的“否定”。 Math'ly、!(y<5)
和 (y>=5)
是等价的。两者都是(y<5)
的否定。我不坚持使用“!”否定符号。可以将否定符号分配给手中的短语,就像!(y<5)
= (y>=5)
。以上是关于R中的do-while循环的主要内容,如果未能解决你的问题,请参考以下文章