我编写了一个表单
的递归函数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
参数,以及我是否应该修改其他内容。
答案 0 :(得分:14)
在这里剪切一些角...表达式-option设置将要计算的嵌套表达式的最大数量。使用深度递归时,有时会超出默认值,增加值通常可以解决问题。但如果没有(给出新的错误消息),您可能需要额外增加保护堆栈的大小。计算机存储有关堆栈中活动例程的信息。有时,当信息不完全适合堆栈时,信息被写入堆栈边界之外,这是不好的,因为它通常会产生例如存储器访问问题。这可以通过在启动R时设置选项--max-ppsize来纠正。这就像给孩子一张大纸张,当他或她透支当前纸张时,也会给桌子着色。
有关更多背景信息,请参阅Wikipedia及其链接。有关R命令行选项的详细信息,请参阅An Introduction to R,B.1部分。
答案 1 :(得分:5)