【问题标题】:Explanation of R: options(expressions=) to non-computer scientists对非计算机科学家的 R 解释:options(expressions=)
【发布时间】:2014-03-27 00:23:35
【问题描述】:

我写了一个形式的递归函数

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 参数,以及我是否应该连同它一起修改其他东西。

【问题讨论】:

    标签: r recursion stack-overflow


    【解决方案1】:

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

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

    由于您在代码中应用 recursion(从自身内部调用函数),因此堆栈会随着每次新调用而增长。最终,您的程序会耗尽存储整个堆栈的内存。

    另请参阅 R 文档中的 Memory

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-30
        • 2017-07-07
        • 1970-01-01
        • 2013-01-29
        • 2013-05-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多