【问题标题】:R and double brackets for nested lists嵌套列表的 R 和双括号
【发布时间】:2019-02-16 16:38:31
【问题描述】:

有很多关于索引列表的帖子,但我仍然无法完全理解命名和未命名嵌套列表的索引方法。这是我的例子

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

现在我看到一些帖子坚持(原文全部大写)“双括号永远不会返回列表。双括号将只返回列表中的一个元素”但这显然不是真的,因为两个索引方法返回列表。但是这两种形式的括号会返回不同的列表,对吧?这里的底层逻辑是什么?

【问题讨论】:

    标签: r list nested brackets


    【解决方案1】:

    考虑一下。 [[ 表示法索引列表元素。但是如果该元素本身是一个列表呢?

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

    在上面的例子中,返回值仍然是一个列表,因为a 是一个列表。返回的值取决于被索引的值。 双括号永远不会返回列表这句话根本不正确。

    这方面的帮助可以在help(Extract)找到-

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

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

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

    【讨论】:

    • 列表person$siblings[1] 是否有一个空白顶层,所以person$siblings[1]$name 为NULL 但person$siblings[[1]]$name 是命名列表?简单的命令 person$siblings[1] 表明我需要双括号才能到达 $name 。 . .所以我实际上得到了这个,但不是概念上的。 .谢谢
    • person$siblings[1] 是 3 个未命名元素的列表。要获取您需要使用的名称person$siblings[[1]][[[ 之间存在主要区别,在 help(Extract) 中进行了解释
    • 注意到class(person[1]) 也是一个列表,这实际上开始变得有意义。 . .不是简单的字符元素或向量!谢谢
    猜你喜欢
    • 1970-01-01
    • 2023-02-16
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多