任何人都可以解释为什么下面的list1
和list2
不相同?
list1 <- list()
lev1 <- "level1"
lev2 <- "level2"
list1[[lev1]][[lev2]] <- 1
list1
$level1
level2
1
list2 <- list()
list2$level1$level2 <- 1
list2
$level1
$level1$level2
[1] 1
答案 0 :(得分:17)
这是因为您要将长度为1的向量分配给NULL原子向量。
来自help(Extract)
-
当
类型的长度向量$<-
应用于NULLx
时,它首先强制x
为list()
。如果替换值[[<-
的长度大于1,value
也会发生这种情况:如果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在评论中提到的更简单的一个例子,就是从一个NULL原子向量开始,看看会发生什么。
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
$<-
的结果始终是一个列表,所以我在这里省略了它。