R:对非计算机科学家的选项(表达式=)的解释

qoh*_*eth 27 stack-overflow recursion r

我写了一个表单的递归函数

foo=function(vars,i=2){
  **do something with vars**
  if(i==length(vars)){
    return(**something**)
  }else{
    foo(vars,i+1)
  }
}
Run Code Online (Sandbox Code Playgroud)

length(vars) 是1500左右.当我执行它时,我得到了错误

Error: evaluation nested too deeply: infinite recursion / options(expressions=)?
Error during wrapup: evaluation nested too deeply: infinite recursion / options(expressions=)?
Run Code Online (Sandbox Code Playgroud)

很公平,所以我增加了

options(expressions=10000)
Run Code Online (Sandbox Code Playgroud)

然后它工作.

但是,当我读到的帮助文档options有关expressions=,我只是不明白它在说什么.此外,它表明

...如果你增加它,你可能还想用更大的保护堆启动R; ...

所以有人可以告诉我发生了什么,如果我应该expressions像我一样增加参数,以及我是否应该修改其他内容.

小智 15

在这里剪切一些角...表达式-option设置将要计算的嵌套表达式的最大数量.使用深度递归时,有时会超出默认值,增加值通常可以解决问题.但如果没有(给出新的错误消息),您可能需要额外增加保护堆栈的大小.计算机存储有关堆栈中活动例程的信息.有时,当信息不完全适合堆栈时,信息被写入堆栈边界之外,这是不好的,因为它通常会产生例如存储器访问问题.这可以通过在启动R时设置选项--max-ppsize来纠正.这就像给孩子一张大纸,当他或她透支当前的纸张时,也给桌子着色.

有关更多背景信息,请参阅Wikipedia及其链接.有关R命令行选项的详细信息,请参阅R简介,B.1节.


Igo*_* F. 6

我猜这样的网站不是计算机科学普通速成课程的正确位置,但在你的情况下,网站名称和问题之间存在匹配:你正在经历堆栈溢出!:-)

在计算机科学中,堆栈是一种数据结构,您只能访问其最后一个元素(半队列,也就是说).有关更多信息,请参阅例如WikipediaCMU.堆栈在调用函数时起着核心作用,因为返回地址和通常的函数参数都存储在那里.从函数返回只是意味着从堆栈中检索返回地址,并从该地址指定的代码中的点继续执行程序.

由于您在代码中应用递归(从内部调用函数),因此堆栈随着每次新调用而增长.最终,您的程序内存不足以存储整个堆栈.

另请参阅R文档中的内存.