2016-09-19 13 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

これは、NULL原子ベクトルに長さ1のベクトルを割り当てるために発生しています。

$<-がNULL xに適用する場合、それは最初list()からxを強制 - help(Extract)から

。置換値valueの長さが1より大きい場合、[[<-の場合も同様です。valueの長さが1または0の場合は、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 

$<-からの結果は常にので、私はそれをここでは省略しているリストです。

+7

同様の簡単なケースでは、 'a = NULL; $ lev1 = 1; b = NULLと比較してa = b [["lev1"]] = 1;これはより明確になるかもしれない。 '' [''は ''アトミックとジェネリックの両方のベクトルに使われているので、 '' NULL''がどうなるべきかを知ることはできません。 –

関連する問題