【问题标题】:Are R lists generalised vectors? [duplicate]R是否列出了广义向量? [复制]
【发布时间】:2014-06-18 17:04:24
【问题描述】:

我的问题源于在用户创建的函数中使用[[]] 来引用列表元素。据我所知,[[]] 在应用于向量时的工作方式与 [] 相同。

这是否适用于所有其他列表操作?再举一个例子,我可以在向量上使用 lapply。

如果一个列表只是一个广义向量,它的条目可以是不同的模式,这是有道理的。

【问题讨论】:

  • 您引用的答案很好地解释了[][[]] 之间的区别,但它并没有告诉我有关列表和向量之间的意识形态关系的任何信息。此外,您引用的问题的标题根本没有提及向量。
  • 也许我的问题更好的措辞是“为列表编写的任何函数都可以接受向量吗?”
  • 啊,我明白你现在在问什么了,这实际上是个好问题。
  • 严格来说,答案是“否”,最明显的例子就是将复杂数据类型分配给列表元素的函数。
  • 这确实是一个很好的反例。不分配给列表的函数怎么办?为了提供更多上下文,我正在编写一个使用 [[]] 而不是 [] 的函数,因为我不希望它在将列表解析为函数时中断。

标签: r list vector


【解决方案1】:

编辑:一行半的答案是列表和原子向量都是向量的类型,并且子集的方式完全相同。

这个答案扩展了列表和原子向量之间的区别。

对 R 的数据结构,特别是列表和原子向量之间的最佳解释,是(在我看来)Hadley Wickham 的新书: http://adv-r.had.co.nz/Data-structures.html

列表和原子向量都是一维数据结构。然而,原子向量是同质的,而列表是异构的。列表可以包含任何类型的向量,包括其他列表。另一方面,原子向量是平坦的。

就使用[][[]] 进行子集化而言,[] 保留用于列表和原子向量,而[[]] 正在简化。因此,[][[]] 并不相同,无论是应用于列表还是原子向量。例如,[[]] 将通过删除名称来简化命名向量;通过[] 对命名向量进行子集化将保留该名称。对于一个列表,[[]]会拉出一个列表的内容,并且可以返回一些简化的数据结构。通过[] 子集列表将始终返回一个列表(保留)。

通过[[]] 子集原子向量返回长度为一的原子向量。通过[[]] 对列表进行子集化可以返回许多不同类别的数据结构。这可以追溯到原子向量是同质的而列表是异构的这一事实。然而,根据 Hadley 的说法,子集列表工作与子集原子向量完全相同。

查看 Hadley 书中的这一部分以供进一步参考: http://adv-r.had.co.nz/Subsetting.html#subsetting-operators

【讨论】:

  • 我不同意剥离名称:[[[ 对列表和向量执行相同的操作。列表上的[[ 也会删除该元素的名称(如果列表已命名)。
  • 你是对的 - 我的意思是 [][[]] 是不同的。 OP 声明“[[ 和 ]] 在应用于向量时与 [和 ] 的工作方式相同。”
  • 对,Hadley 很好地解释了这些差异。我认为 OP 试图得到的是,异构与同质的差异是否会产生超出每个可以存储的数据类型的任何实际差异。
  • [[ 可以(旨在)只选择一个元素,但在嵌套列表的情况下可以有多个索引。 list(list(1, list(1,2,3)))[[1:3]]
  • @lebatsnok 这很有趣。我以前从未见过[[ 像这样使用过。我通常会使用x[[1]][[2]][[3]]。很好的速记,但在返回这样编写的代码时应该小心。我觉得很容易混淆!
【解决方案2】:

由于我无法提出更多反例,因此我参考了有关 R 内部结构的文档,看来您的直觉是正确的。

如果您查看有关 C 中 R 数据结构的底层结构的部分, SEXPTYPEs,列表暗示为通用向量:

19 VECSXP列表(通用向量)

【讨论】:

    猜你喜欢
    • 2015-12-03
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多