R列表是广义向量吗?

R列表是广义向量吗?,r,list,vector,R,List,Vector,我的问题源于在用户创建的函数中使用[[和]引用列表元素。据我所知,[[和]应用于向量时与[和]的工作方式相同 但是,所有其他列表操作都是这样吗?作为另一个例子,我可以在向量上使用lappy 如果列表只是一个广义向量,其条目可以是不同的模式,那么这是有意义的。编辑:一行半的答案是列表和原子向量都是向量的类型,并且子集的方式完全相同。 这个答案扩展了列表和原子向量之间的区别 对于R的数据结构,特别是列表和原子向量之间的数据结构,最好的解释是(在我看来)Hadley Wickham的新书: 列表和原

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

但是,所有其他列表操作都是这样吗?作为另一个例子,我可以在向量上使用lappy


如果列表只是一个广义向量,其条目可以是不同的模式,那么这是有意义的。编辑:一行半的答案是列表和原子向量都是向量的类型,并且子集的方式完全相同。

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

对于R的数据结构,特别是列表和原子向量之间的数据结构,最好的解释是(在我看来)Hadley Wickham的新书:

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

就使用
[]
[[]]
的子集而言,
[]
保留了列表和原子向量,其中As
[[]]
简化了。因此,
[]
[[]]
不一样,无论是应用于列表还是原子向量。例如,
[[]]
将通过删除名称简化命名向量;通过
[]
将命名向量子集将保留该名称。对于列表,
[[]]
将拉出列表的内容,并可以返回许多简化的数据结构。通过
[]
子集列表将始终返回一个列表(保留)

通过
[[]]
对一个原子向量进行子集设置将返回一个长度为1的原子向量。通过
[[]]
子集列表可以返回许多不同类别的数据结构。这可以追溯到原子向量是同质的,而列表是异质的。然而,根据哈德利的说法,子集列表的工作方式与子集原子向量的工作方式完全相同

请查看哈德利书的这一部分,以便进一步参考:

由于我无法提出更多的反例,我参考了R内部的文档,您的直觉似乎是正确的

如果你看一下C语言中R数据结构的底层结构部分, ,列表暗示为通用向量:

19向量SP列表(通用向量)


你提到的答案很好地解释了
[]
[[]]
之间的区别,但它没有告诉我列表和向量之间的意识形态关系。另外,你提到的问题的标题根本没有提到向量。也许我的问题的更好措辞是“为列表编写的任何函数都可以接受向量吗?”啊,我知道你现在问的是什么,这实际上是个好问题。严格地说,答案是“不”,一个明显的例子是为列表元素分配复杂数据类型的函数。这确实是一个很好的反例。对于不向列表分配任务的函数呢?为了提供更多的上下文,我正在使用
[[[]]
而不是
[]
编写一个函数,因为我不希望在将列表解析到函数时它中断。我不同意名称剥离:
[[[
[
对列表和向量执行相同的操作。
[列表上的[
也将删除该元素的名称(如果列表已命名)。你是正确的-我的观点是,
[]
[[]]
是不同的。OP声明“[[和]]在应用于向量时与[和]的工作方式相同。”没错,Hadley在解释差异方面做得很好。我认为OP想要了解的是,除了每个人可以存储的数据类型之外,异构与同质的差异是否会产生任何实际的差异只选择一个元素,但在嵌套列表的情况下可以有多个索引。
list(list(1,list(1,2,3))[[1:3]]
@lebatsnok这很有趣。我以前没有见过像这样使用
[
。我通常会使用
x[[1][[2][[3]]
。很好的速记,但是在返回到像这样编写的代码时应该小心。我觉得很容易混淆!