2014-02-25 52 views
21

我寫形式說明的R:

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,並且我應該修改其他參數。

回答

12

在這裏切割一些角...表達式選項設置將被評估的嵌套表達式的最大數目。深度遞歸有時會超過默認值,並且增加值通常可以解決問題。但如果沒有(給出新的錯誤信息),則可能需要額外增加保護堆棧的大小。計算機將有關活動例程的信息存儲在堆棧中。有時當信息不太適合堆棧時,信息被寫入堆棧邊界之外,這是不好的,因爲它通常會產生,例如,內存訪問問題。這可以通過在啓動R時設置選項--max-ppsize來解決。這就像在孩子透過當前紙張時給孩子一張較大的紙張,併爲桌子着色。

欲瞭解更多背景,請參閱Wikipedia及其鏈接。有關R命令行選項的詳細信息,請參見An Introduction to R,第B.1節。

2

我猜這樣的網站不是一個計算機科學的通用碰撞課程的正確位置,但在您的情況下,網站名稱和問題之間存在匹配:您遇到堆棧溢出問題! :-)

在計算機科學中,堆棧數據結構,你只能訪問它的最後一個元素(一個半隊列,可以這麼說)。有關更多信息,請參閱WikipediaCMU。調用函數時,堆棧起着核心作用,因爲返回地址和函數參數都存儲在那裏。從函數返回僅僅意味着從堆棧中檢索返回地址並從該地址指定的代碼點繼續執行程序。

由於您在您的代碼中應用遞歸(從本身內部調用函數),堆棧隨着每次新的調用而增長。最終,您的程序將耗盡內存來存儲整個堆棧。

參見R文檔中的Memory