这是预期的行为。当您分配给对象元素的索引时,如果该元素不存在,R 将创建该元素。在您的示例中,“dimnames”不存在aa
,因此 R 尝试根据您分配给它的内容创建“dimnames”。考虑为列表分配名为“a”、“b”和“c”的元素:
> L <- list()
> L$a[[1]] <- 5
> L$b[[3]] <- "foo"
> L$c[[4]] <- c(1,2,3)
> class(L$a)
[1] "numeric"
> class(L$b)
[1] "character"
> class(L$c)
[1] "list"
现在说的问题L$a[[1]] <- anything
是L$a
还不存在。当一个元素不存在时会发生什么,R 只是创建了最简单的可以工作的元素类型。正如你所看到的,L$a[[1]] <- 5
如果是一个数字向量是有意义L$a
的,所以 R 使它成为一个数字向量。L$b[[3]] <- "foo"
如果是数字向量没有意义L$b
,但如果是字符向量就有意义L$b
,所以这就是 R 创建的。但L$c[[4]] <- c(1,2,3)
只有在L$c
是一个列表时才会发生,所以在这种情况下你会得到一个列表。
在您的情况下,它会尝试dimnames
根据该规则进行创建;所以它制作dimnames(aa)
了一个列表,但它只制作dimnames(bb)
了一个字符向量。但是dimnames
有一个额外的限制,它必须是一个列表,所以它反对并且你得到一个错误。