添加到子列表取决于列表结构。作为第一个操作,将原子元素添加到子列表不会形成子列表。
具有简单的测试用例
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()子列表之前被分配了原子子列表时,正在构造另一种不同类型的列表。
答案 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')