列表索引中[[]]和$之间有什么区别?

Kev*_*ham 14 r

任何人都可以解释为什么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
Run Code Online (Sandbox Code Playgroud)

Ric*_*ven 17

发生这种情况是因为您要将长度为1的向量分配给NULL原子向量.

来自help(Extract)-

$<-应用于NULL时x,它首先强制x执行list().[[<-如果替换值value的长度大于1 ,也会发生这种情况:如果value长度为1或0,x则首先强制转换为类型为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
Run Code Online (Sandbox Code Playgroud)

正如@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
Run Code Online (Sandbox Code Playgroud)

结果$<-始终是一个列表,所以我在这里省略了它.

  • 在类似的简单情况下,`a = NULL; a $ lev1 = 1; a`与`b = NULL相比; b [["lev1"]] = 1; 这可能更清楚了.由于`"[[< - "`用于原子和通用向量,R不能知道`NULL`应该变成什么并且假设一个简单的场景. (7认同)