关于索引列表的文章很多,但是我仍然不太了解命名和未命名嵌套列表的索引方法。这是我的例子
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
现在,我看到一些帖子坚持(原始格式中的所有大写字母)“一个双括号将永远不会返回列表。一个双括号将只会从列表中返回一个元素”,但是由于两个索引都显然不正确方法返回列表。但是两种形式的方括号都返回不同的列表,对吗?这里的基本逻辑是什么?
答案 0 :(得分:4)
考虑一下。 [[
标记索引列表元素。但是,如果该元素本身是列表呢?
list(a = list(b = 1))[[1]]
# $b
# [1] 1
在上面的示例中,返回值仍然是列表,因为a
是列表。返回的值取决于所索引的值。语句双括号将永远不会返回列表完全是错误的。
对此的帮助可以在help(Extract)
-
用
[
进行索引类似于原子向量,并且选择指定元素的列表。
[[
和$
都选择列表中的单个元素。
它也有助于了解原子和递归(类似列表)向量之间的区别。