2016-09-19 63 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'應該成爲什麼,並且假設一個簡單的場景。 –

相關問題