嵌套列表的R和双括号

时间:2019-02-16 16:38:31

标签: r list nested brackets

关于索引列表的文章很多,但是我仍然不太了解命名和未命名嵌套列表的索引方法。这是我的例子

person <- list("name"="John","age"=19,"speaks"=c("English","French")) 
Johns_brother <- list("name"="Sam","age"=20,"speaks"=c("English","Spanish"))
Johns_sister <- list("name"="Minerva","age"=17,"speaks"=c("English","Italian"))
Johns_sister <- list("name"="Minerva","age"=17,"speaks"=c("English","Italian"))
Johns_other_sister <- list("name"="Casandra","age"=23,"speaks"=c("English","Greek"))
person <- list("name"="John","age"=19,"speaks"=c("English","French"),"siblings"=list(Johns_brother,Johns_sister,Johns_other_sister))

这两种索引方法均返回列表

class(person$siblings[1])
class(person$siblings[[1]])

但是只有第二个允许我选择命名元素

person$siblings[1]$name
person$siblings[[1]]$name

现在,我看到一些帖子坚持(原始格式中的所有大写字母)“一个双括号将永远不会返回列表。一个双括号将只会从列表中返回一个元素”,但是由于两个索引都显然不正确方法返回列表。但是两种形式的方括号都返回不同的列表,对吗?这里的基本逻辑是什么?

1 个答案:

答案 0 :(得分:4)

考虑一下。 [[标记索引列表元素。但是,如果该元素本身是列​​表呢?

list(a = list(b = 1))[[1]]
# $b
# [1] 1

在上面的示例中,返回值仍然是列表,因为a是列表。返回的值取决于所索引的值。语句双括号将永远不会返回列表完全是错误的。

对此的帮助可以在help(Extract)-

中找到
  

[进行索引类似于原子向量,并且选择指定元素的列表

     

[[$都选择列表中的单个元素。

它也有助于了解原子和递归(类似列表)向量之间的区别。