2010-12-05 13 views
47

do-while-styleループの書き方については不思議でしたか?do-while loop in R

私はthis postを見つけました:

あなたが「ブレーク」制御ワードでループを繰り返し{}を使用し、(あれば使用してwhereever条件を確認してください)と 終了することができます。

正確にはどういう意味ですか。誰かがそれを理解しているか、あなたが別の解決策を持っているかどうかを精緻に教えてください。

+2

@Jerichoと@DWinの回答の違いは、「ステートメント」が評価されることです。 @ Jerichoの答えでは、 "ステートメント"の後にブレーク条件が来るので、ループは少なくとも1回実行されます。 @ DWinの答えでは、 'y'が5以上になった場合、ループはまったく実行されません。あなたが好むものは、「ステートメント」をまったく実行したいかどうかによって異なります。 –

+0

結論として、do while文は少なくとも1回は実行されてから、文にループバックする前に条件をチェックします。 –

+0

したがって、do-whileループの代わりにwhileループを使用することができます。ループの前に条件をtrueに設定することでループ(文)を少なくとも1回実行することができます。 Dwinの答えのように)。 – Henrik

答えて

77

かなり自明です。

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

または私が思うようなもの。 do whileループの効果を得るには、文のグループの最後で条件を確認するだけです。

+0

これは使用中よりも速いですか? – Emer

+1

whileとa doは異なる場合に使用されます。ちょうどそれをこのように考えてください。 - > 0〜何度実行しても、1〜何度も実行してください。私はそれをより速くまたは遅く見ないでしょう。時には少なくとも1回は実行したい、いくつかは実行したくないときがあります。それは条件の配置以上のものではありません。 –

+2

私には42の答えは真ですが、Salcedoの答えは偽です。 42の答えでは、条件の中にNEGATIONがあります( 'repeat({expressions}; if(!end_cond_expr){break})')。ですから、EndConditionはrepeat!EndConditionによってシミュレートされます。この事実をコードスニペットで確認しました。 –

16

そうでそれをdo_whileはRで別々の構築物として存在していませんが、あなたは偽物でき?ControlまたはR Language Definition:

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

を参照してください:あなたは、ヘルプページを参照したい場合は

repeat({ expressions}; if (! end_cond_expr) {break}) 

?whileまたは?repeatをコンソールに入力することはできませんが、?'repeat'または?'while'を使用する必要があります。 ifを含むすべての「制御構造」は同じページにあり、「?」の後ろにすべて文字の引用が必要です。通訳者はそれらを不完全なコードとみなさず、あなたに継続 "+"を与えます。

+3

これは要求された「do-while」ではなく、「while-do」です。ポイントは、do-while setupは、ある場所(ループブロックの外側と内側で繰り返されない)にいくつかのコマンドを書き込んで、意図した関数が一度呼び出されることを保証することです。この回答のように、 'y'に値を割り当てる行が2行あることが分かります(最初の行と' print'呼び出しの中にもあります)。冗長性を減らし、特定の状況でバグを減らすには、一方、変数(例えば 'y')は一度しか割り当てません。 – Kalin

+0

私は鈍いことを許しますが、あなたが書いたものは照らすコード例なしでは不透明です –

+0

キーは終了条件が実行されるタイミングです。 do-while-loopsでは、各反復を続行する前に条件が真であるかどうかテストされますが、repeat-until-loopsでは反復の最後にテストが実行され、TRUE値が見つかると終了します。 –

5

他の回答をもとに、do-whileの動作を実現するためにwhileループ構造体を使用する例を共有したいと考えました。 while条件(TRUEに初期化)で単純なブール変数を使用して、後でifステートメントで実際の条件をチェックします。 if文の中でFALSEを続ける代わりに、breakキーワードを使用することもできます(おそらくもっと効率的です)。そのユーザ42の完璧なアプローチに着目

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 
    } 
    } 
0

{
* =
*コード等価 "の繰り返しではないまで" "んが":

do while (condition) # in other language 
..statements.. 
endo 

repeat{ # in R 
    ..statements.. 
    if(! condition){ break } # Negation is crucial here! 
} 

}はなかったです十分な注意を他の人から受け取っていないので、具体的な例を挙げて彼のアプローチを強調して紹介します。 do-whileの条件を否定しない場合(!または否定を取ることによって)、コードの経過に応じて歪んだ状況(1.値の永続性2.無限ループ)が存在します。ガウスで

:Rで

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 

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-中で条件の否定せず、サルセドの答えが間違っていると主張。上記のコードで否定記号を削除することでこれを確認することができます。

+1

私はあなたがSalcedoの答えを誤解していると思います。擬似コードに明示的な条件がありません。あなたは '(条件)'を '!(y <5)'に置き換えることもできますし、 '(y> = 5)'で置き換えることもできます。それは否定記号を持つ必要はありません、ループを停止するために論理条件が必要なものだけです。 – matt

+0

いいえ、私は誤解していません。私が強調しているのは、do-whileの指定された条件の「否定」を使用しなければならないということです。 Math'ly、 '!(y <5)' and '(y> = 5)'は同等です。どちらも '(y <5)'の否定です。私は "!"の使用を主張していません。否定記号。 '!(y <5)' = '(y> = 5)'のように、否定記号を手の中のフレーズに配布することができます。 –