如何在R中实现向量,矩阵和数据帧?

时间:2012-12-18 21:37:34

标签: c r data-structures

我一直在努力了解流行语言中使用的不同数据结构,例如Python中的列表和词典,PHP中的关联数组(主要是哈希表),C ++中的向量等。

我有很多同事虔诚地使用R,我想知道R中是如何实现向量,矩阵和数据框架的。它们的优点和缺点是什么?我正在查看源代码,但我自己找不到数据结构。源代码中的这些定义位于何处?

3 个答案:

答案 0 :(得分:5)

如前所述,请查看"R internals"手册以及this part of "Writing R extensions"

答案 1 :(得分:1)

来自R Internals,1.1 SEXP:

  

...... R对象的基本构建块通常称为节点......两种类型的节点结构都有前32个spxinfo头的前三个字段,然后是三个指针(属性和前一个和下一个)双链表中的节点)

因此R中的向量被实现为双向链表。并且,甚至看起来没有比单节点链表更小的数据结构。这很明显:

> a <- 4
> a[1]
4

正如其他人所说:builtin.cdo_makevectordo_makelistarray.cdo_matrix的来源。此外,array.c包含allocMatrix的来源,memory.c包含allocVector的来源。

虽然很多事情都在发生,但很明显,矩阵只是一个双向链表的双重链接列表。我相信(虽然不确定)行和列名称(如存储在数据框中的名称)存储在每个列表的“属性”中。

对数据结构实现的“优点和缺点”的响应是(根据我的有限知识)双向链表有一个优势,即动态内存分配更简单,不需要开销复制和重新分配整个数组,并且(取决于列表有多少指针:头部,尾部,中间,四分之一等)访问随机值v[99]的弱点可能会占用开销在找到所需元素之前迭代几个元素。

这是对的吗?

答案 2 :(得分:0)

有点晚了,但是想用其他一个答案指出一个错误并给出一个明确的答案。看内幕手册:

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

阅读本节的开头,以及&#39; INTSXP&#39;的条目。似乎整数向量被实现为C int的数组。同样地,对于&#39; REALSXP&#39;和&#39; CHARSXP&#39;。

将其作为链接列表实施将会非常缓慢。