web-dev-qa-db-ja.com

Rの説明:コンピューター以外の科学者に対するoptions(expressions =)

私はフォームの再帰関数を書きました

_foo=function(vars,i=2){
  **do something with vars**
  if(i==length(vars)){
    return(**something**)
  }else{
    foo(vars,i+1)
  }
}
_

length(vars)は1500前後です。実行するとエラーが発生しました

_Error: evaluation nested too deeply: infinite recursion / options(expressions=)?
Error during wrapup: evaluation nested too deeply: infinite recursion / options(expressions=)?
_

十分に公正なので、私は増加しました

_options(expressions=10000)
_

その後、動作します。

しかし、_expressions=_に関するoptionsのヘルプドキュメントを読むと、それが何を言っているのか理解できません。さらに、それは提案します

...それを増やす場合、より大きな保護スタックでRを起動することもできます; ...

だから、もし私がexpressionsパラメータを増やしたはずで、もしそれと一緒に何か他のものを修正すべきなら、誰かが何が起こっているのか教えてもらえますか。

27
qoheleth

ここでいくつかの角を切ります...式-optionは、評価されるネストされた式の最大数を設定します。深い再帰では、デフォルトを超えることがあり、値を大きくすると問題が解決することがよくあります。しかし、そうでない場合(新しいエラーメッセージが表示される)、保護スタックのサイズをさらに増やす必要があります。コンピューターは、アクティブなルーチンに関する情報をスタックに保存します。情報がスタックに完全に適合しない場合、スタック境界を超えて情報が書き込まれることがありますが、これは通常、たとえばメモリアクセスの問題を引き起こすため、悪いことです。これは、Rの起動時にオプション--max-ppsizeを設定することで修正できる可能性があります。これは、子供が現在の用紙をオーバードローし、テーブルにも色を付けるときに、子供に大きな用紙を与えるようなものです。

詳細な背景については、 Wikipedia およびそのリンクを参照してください。 Rのコマンドラインオプションの詳細については、 Rの概要 、セクションB.1を参照してください。

15
user2357031

このようなサイトは、コンピューターサイエンスの一般的なクラッシュコースにふさわしい場所ではないと思いますが、あなたの場合、サイト名と質問の間に一致があります:スタックオーバーフローが発生しています! :-)

コンピューターサイエンスでは、stackは、アクセス可能なデータ構造です最後の要素(つまり、ハーフキュー)のみ。詳細については、 Wikipedia または [〜#〜] cmu [〜#〜] 。関数を呼び出すときにスタックが中心的な役割を果たします。これは、リターンアドレスと多くの場合関数引数がそこに格納されるためです。関数から戻るとは、単にスタックから戻りアドレスを取得し、そのアドレスで指定されたコード内のポイントからプログラムの実行を継続することを意味します。

コード内でrecursionを適用しているため(内部から関数を呼び出す)、新しい呼び出しごとにスタックが大きくなります。最終的に、プログラムはスタック全体を保存するためのメモリを使い果たします。

Rドキュメントの Memory も参照してください。

6
Igor F.