2012-12-18 57 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'也是如此。

将它作为链表执行会非常慢。