2016-09-19 17 views
14

list1 ve list2 neden aynı olmadığını açıklayabilir mi?

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 

cevap

17

Bu, NULL atomik vektörüne 1 uzunluğundaki bir vektör atadığınız için ortaya çıkmaktadır.

help(Extract) itibaren - $<- NULL x uygulanır

, ilk list() için x coerces. Bu, value ikame değerinin 1'den büyük olması durumunda [[<- ile de gerçekleşir: value 1 veya 0'a sahipse, ilk olarak value türünün sıfır uzunluklu bir vektörüne zorlanır.

Değişme (uzunluk 0 veya 1 vektörü küçük veya başka bir şey) ... <- 1:2 için atama ve her iki kod blokları aynı sonucu alırsınız. yorumlarında @alexis_laz tarafından belirtildiği gibi

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 

bu daha basit bir örneği, sadece bir NULL atomik vektör ile başlar ve ne bakmaktır.

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 

$<- gelen sonuç hep bu yüzden buraya atladık bir listedir.

+7

Benzer şekilde daha basit bir durumda 'a = NULL; bir $ lev1 = 1; a 'ile karşılaştırıldı, b = NULL; b [["lev1"]] = 1; Bu daha açık olabilir. “[[<-” ', hem atomik hem de jenerik vektörler için kullanıldığından, R, NULL'un neyin nesi olduğunu ve basit bir senaryosu ne olduğunu bilmez. –

İlgili konular