这是因为您将长度为1的矢量指定给NULL原子矢量。
从help(Extract)
-
当$<-
被施加到NULL x
,它首先胁迫x
到list()
。如果替换值value
的长度大于1,那么[[<-
也会发生这种情况:如果value
具有长度1或0,x
首先被强制为类型为value
的零长度向量。
将赋值更改为... <- 1:2
(或长度为0或1的矢量以外的东西),您将在两个代码块中得到相同的结果。
list1 <- list()
lev1 <- "level1"
lev2 <- "level2"
list1[[lev1]][[lev2]] <- 1:2
list1
# $level1
# $level1$level2
# [1] 1 2
list2 <- list()
list2$level1$level2 <- 1:2
list2
# $level1
# $level1$level2
# [1] 1 2
这方面的一个简单的例子,如@alexis_laz在评论中提到的,仅仅是开始与空原子向量,看看会发生什么。
x <- NULL
## assign a length 1 vector --> atomic result
x[["lev1"]] <- 1
x
# lev1
# 1
y <- NULL
## assign a length > 1 vector --> list result
y[["lev1"]] <- 1:2
y
# $lev1
# [1] 1 2
从$<-
的结果总是一个列表,所以我在这里省略了它。
在类似的简单情况下,a = NULL; $ lev1 = 1; a'与'b = NULL'相比较; b [[“lev1”]] = 1;这可能会更清楚。由于'[[< - “'既用于原子矢量也用于泛型矢量,因此R无法知道'NULL'应该成为什么,并且假设一个简单的场景。 –