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

时间:2014-02-25 01:46:54

标签: r recursion stack-overflow

我编写了一个表单

的递归函数
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)

然后它有效。

但是当我阅读options关于expressions=的帮助文档时,我只是不明白它的含义。此外,它建议

  

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

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

2 个答案:

答案 0 :(得分:14)

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

有关更多背景信息,请参阅Wikipedia及其链接。有关R命令行选项的详细信息,请参阅An Introduction to R,B.1部分。

答案 1 :(得分:5)

我想像这样的网站不适合进行计算机科学的一般碰撞课程,但在你的情况下,网站名称和问题之间存在匹配:你正在经历堆栈溢出! : - )

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

由于您在代码中应用 recursion (从内部调用函数),因此每次调用时堆栈都会增长。最终,你的程序内存不足,无法存储整个堆栈。

另请参阅R文档中的Memory