2012-12-18 85 views
9

我一直在嘗試瞭解我使用的流行語言中的不同數據結構,例如Python中的列表和字典,PHP中的關聯數組(本質上是哈希表),C++中的向量等。在R中如何實現向量,矩陣和數據框架?

我有很多使用R的同事,我很想知道在R中如何實現向量,矩陣和數據框架。他們的優點和缺點是什麼?我正在瀏覽源代碼,但我無法自己找到數據結構。源代碼中的這些定義位於何處?

+0

http://cran.r-project.org/doc/manuals/r-release/R-lang.html有幫助嗎? (不一定:它說數據結構是如何定義的*,而不是它們如何實現......) –

+7

在'$ R_SRC_HOME/src/main /'中,在'builtin.c'中查找'do_makevector',在'array.c'中查找'do_matrix'。 data.frames只是類data.frame的列表,所以你可能只需要看看'do_makelist'(也在'builtin.c'中),然後在你的R中鍵入'data.frame'返回的R代碼安慰。對於大局,R手冊可能會更有幫助:查看鏈接到的一個@BenBolker以及[「R-internals」](http://cran.r-project.org/doc/manuals/Rints .html)手冊。 –

+0

@ JoshO'Brien應該是一個答案,而不是評論(提前+1)。 –

回答

1

從r塔內,1.1 SEXPs:

...ř對象通常被稱爲節點的基本構建塊...這兩種類型的節點結構的作爲它們的前三個字段32位spxinfo然後是三個指針(屬性和雙向鏈表中的屬性以及上一個和下一個節點)

因此,R中的向量被實現爲雙向鏈表。而且,它甚至似乎沒有比單節點鏈表更小的數據結構。這由是顯而易見的:

> a <- 4 
> a[1] 
4 

正如其他人所說:builtin.cdo_makevectordo_makelistarray.cdo_matrix源。另外array.c包含allocMatrixmemory.c的來源包含allocVector的來源。

雖然很多事情發生在我的頭上,但似乎很明顯,矩陣只是雙向鏈表的雙向鏈接列表。我相信(儘管我不確定)行和列的名稱(如存儲在數據框中的名稱)存儲在每個列表的「屬性」中。

對數據結構實現的「優點和缺點」的迴應是(從我有限的知識中)雙鏈表有一個優點,即動態內存分配更簡單,並且不需要複製和重新分配整個數組的開銷,以及(取決於列表中有多少指針:頭部,尾部,中間,四分之一等等)訪問隨機值v[99]的弱點可能會花費迭代幾次找到期望的元素之前的元素。

這是正確的嗎?

0

有點晚了,但想指出與其他答案之一的錯誤,並給出明確的答案。看看內部手冊:

https://cran.r-project.org/doc/manuals/R-ints.html#The-_0027data_0027

閱讀本節的開始,而對於「INTSXP」的條目。看來整數向量是作爲C int數組實現的。對於'REALSXP'和'CHARSXP'也是如此。

將它作爲鏈表執行會非常慢。