73

do-whileスタイルのループをどのように書くか疑問に思っていましたか?

私はこの投稿を見つけました:

repeat {}を使用し、if()を使用して条件を確認し、「break」制御ワードでループを終了できます。

それが正確に何を意味するのかわかりません。あなたがそれを理解している場合、および/またはあなたが別の解決策を持っている場合、誰かが詳しく説明できますか?

4

4 に答える 4

137

かなり自明です。

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

またはそのようなものだと思います。do whileループの効果を得るには、ステートメントのグループの最後で条件を確認するだけです。

于 2010-12-05T07:33:52.913 に答える
29

?ControlまたはR言語定義を参照してください。

> 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またはを入力することはできませんが、またはを使用する必要があります。を含むすべての「control-constructs」は同じページにあり、「?」の後に文字を引用符で囲む必要があります。したがって、インタプリタはそれらを不完全なコードとは見なさず、継続「+」を提供します。?repeat?'repeat'?'while'if

于 2010-12-05T13:18:49.840 に答える
6

他の答えに基づいて、whileループ構造を使用してdo-while動作を実現する例を共有したいと思いました。while条件(TRUEに初期化)で単純なブール変数を使用し、後でifステートメントで実際の条件を確認します。ifステートメント内でcontinue<-FALSEの代わりにbreakキーワードを使用することもできます(おそらくより効率的です)。

  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
    }
  }
于 2016-03-06T13:08:42.313 に答える
1

そのユーザー42-の完璧なアプローチに気付く{
*"dowhile" = "repeat until not"
*コードの同等性:

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の答えは間違っていると主張します。上記のコードで否定記号を削除することで、これを確認できます。

于 2017-06-16T21:44:07.580 に答える