为什么R添加到列表的行为取决于分配顺序

时间:2019-06-17 18:08:10

标签: r

添加到子列表取决于列表结构。作为第一个操作,将原子元素添加到子列表不会形成子列表。

具有简单的测试用例

tl <- list()
tl[['a']][['aa']] <- list(1,2,3)
tl[['a']][['bb']] <- 'b'
tl[['a']][['cc']] <- list('a','b','c','d')

bl <- list()
bl[['bb']] <- 'b'
bl[['aa']] <- list(1,2,3)
bl[['cc']] <- list('a','b','c','d')

cl <- list()
cl[['a']][['bb']] <- 'b'
cl[['a']][['aa']] <- list(1,2,3)
cl[['a']][['cc']] <- list('a','b','c','d')

dl <- list()
dl[['bb']] <- 'b'
dl[['aa']] <- list(1,2,3)
dl[['cc']] <- list('a','b','c','d')
nl <- list()
nl[['a']] <- dl

列表tl,bl和nl符合我的预期。但是,列表cl给出以下错误:cl [[“”“] [[” aa“]] <-list(1、2、3)中的错误:   提供的元素多于要替换的元素。

R在尝试分配list()子列表之前被分配了原子子列表时,正在构造另一种不同类型的列表。

1 个答案:

答案 0 :(得分:1)

“问题”是[[<-的默认行为。这是一个通用运算符,它根据您使用的对象类型而做不同的事情。它不仅用于列表。考虑这个例子

x <- NULL
x[["b"]] <- 'c'
# str(x)
#   Named chr "c"
#  - attr(*, "names")= chr "b"

此处x被定义为NULL。在这种情况下,x[["b"]]x变成一个命名向量(不是列表)。那是因为R不知道您希望x是一个列表,所以它只是选择了可能的最简单的数据类型。

分配给指定的插槽并期望容器自动实例化称为自动生存,而Perl之类的语言确实很喜欢,这并不是R中的核心概念。如果您需要一个以前从未有过列表的列表,确保明确创建它。

cl <- list()
cl[['a']] <- list()
cl[['a']][['bb']] <- 'b'
cl[['a']][['aa']] <- list(1,2,3)
cl[['a']][['cc']] <- list('a','b','c','d')