2016-09-19 88 views
14

任何人都可以解释为什么list1list2下面是不一样的?

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 

回答

17

这是因为您将长度为1的矢量指定给NULL原子矢量。

help(Extract) -

$<-被施加到NULL x,它首先胁迫xlist()。如果替换值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 

$<-的结果总是一个列表,所以我在这里省略了它。

+7

在类似的简单情况下,a = NULL; $ lev1 = 1; a'与'b = NULL'相比较; b [[“lev1”]] = 1;这可能会更清楚。由于'[[< - “'既用于原子矢量也用于泛型矢量,因此R无法知道'NULL'应该成为什么,并且假设一个简单的场景。 –

相关问题