【问题标题】:how are vectors, matrices, and data frames implemented in R?向量、矩阵和数据框是如何在 R 中实现的?
【发布时间】:2012-12-18 21:37:33
【问题描述】:

我一直在尝试了解流行语言中使用的不同数据结构,例如 Python 中的列表和字典、PHP 中的关联数组(本质上是哈希表)、C++ 中的向量等。

p>

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

【问题讨论】:

  • cran.r-project.org/doc/manuals/r-release/R-lang.html 有帮助吗? (不一定:它说明了数据结构是如何定义的,而不是它们是如何实现的......)
  • $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" 手册。
  • @JoshO'Brien 这应该是一个答案,而不是评论(提前+1)。

标签: c r data-structures


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    来自 R Internals,1.1 SEXP:

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

    因此,R 中的向量被实现为双向链表。而且,似乎没有比单节点链表更小的数据结构。这一点很明显:

    > a <- 4
    > a[1]
    4
    

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

    虽然很多事情发生在我的脑海中,但很明显,矩阵只是双向链表的双向链表。我相信(虽然我不确定)行名和列名(就像存储在数据框中的那些)存储在每个列表的“属性”中。

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

    这是正确的吗?

    【讨论】:

      【解决方案3】:

      有点晚了,但想指出其他答案之一的错误并给出明确的答案。查看内部手册:

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

      阅读本节的开头以及“INTSXP”的条目。似乎整数向量被实现为 C int 的数组。 'REALSXP' 和 'CHARSXP' 也是如此。

      将其实现为链表会非常缓慢。

      【讨论】:

        猜你喜欢
        • 2013-02-14
        • 1970-01-01
        • 2018-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-11
        相关资源
        最近更新 更多