【问题标题】:Is there a logical way to think about List Indexing?是否有一种合理的方式来考虑列表索引?
【发布时间】:2016-04-21 18:22:36
【问题描述】:

理解下面mylist[2]mylist[[2]]区别的基本逻辑或哲学基础是什么?

理解单方括号与双方括号的简单逻辑方法是什么?

> mylist <- list(1, list("a","b","c"))

> mylist[2]
# [[1]]
# [[1]][[1]]
# [1] "a"

# [[1]][[2]]
# [1] "b"

# [[1]][[3]]
# [1] "c"

> mylist[[2]]
# [[1]]
# [1] "a"

# [[2]]
# [1] "b"

# [[3]]
# [1] "c"

【问题讨论】:

  • mylist[2] 是 mylist 的子列表。它将是一个列表,其中包含与“[”的数字或字符参数中的元素一样多的元素。 mylist[[2]]mylist[2] 的内容。 "[[" 函数只需要返回一个元素,尽管在这种情况下它是一个包含多个元素的列表。它可以是另一个列表(如本例所示),也可以是矩阵或无维度原子向量。
  • mylist[2] 返回一个包含一个元素的列表(在您的示例中是一个列表)。所以你最终得到一个包含三个character 向量的列表。 mylist[[2]]mylist 的第二个元素,这是三个character 向量的列表。试试length(mylist[2])length(mylist[[2]])。另见str(mylist[2])str(mylist[[2]]) 的输出。
  • 我听到的一个类比是将列表想象成一列火车。火车上的每节车厢都载着东西。如果你去掉两节车厢,你的火车就少了两节车厢。如果你把除了一辆车以外的所有东西都移走,它仍然是一列火车。这相当于[]。要查看某辆车里装了什么东西,你必须打开车门,相当于[[]]
  • @lmo ...有时当您打开火车车厢的门时,里面坐着一整列火车! :)
  • 到现在为止的好话。一个后果是你可以做..[i:j](给你列表的一部分作为列表)但你不能做..[[i:j]](因为每个“汽车”的内容可能与其他“汽车”的内容非常不同) .

标签: r list


【解决方案1】:

一个简单的类比是将列表想象成一列火车。火车上的每节车厢都载着东西。如果你去掉两节车厢,你的火车就少了两节车厢。如果你把除了一辆车之外的所有东西都去掉,它仍然是一辆只有一辆车的火车。

  • 通过[](子集)函数可以实现减小火车的大小或重新组织车厢的顺序。
  • 要检查特定汽车的内容,您必须打开车门,这是通过[[]] 实现的(尽管$ 也可以与命名列表一起使用)。我将其称为提取函数,但我不确定这是否是一个广泛使用的术语。

在您的示例中, mylist[2] 是 mylist 的子列表,其中包含一个元素。您可以使用length(mylist[2]) 验证这一点。如果参数有效,[ 函数将提供一个列表,其中包含作为参数提供给[ 的数字或字符向量中的元素数量。大多数情况下,我们对检查列表项的内容感兴趣。这是通过[[ 函数实现的。比如mylist[[2]]就是mylist[2]的内容,它本身就是一个包含多个元素的列表。要查看此内容,请尝试length(mylist[[2]])

因为[可以被认为是一个列表子集函数,[[是一个列表元素提取函数,mylist[1:2]mylist[c(1,2)]返回一个子列表(在这种情况下相当于mylist),而@ 987654337@ 和 mylist[[c(1,2)]] 返回“下标越界”错误。一次只能提取一个列表元素(即每个函数调用)。

@richard-scriven 提醒我注意 Hadley Wickham twitter post 上的链接,该链接提供了照片形式的嵌套列表的额外类比。

str 具有相当简单的列表结构,是了解列表内容的好方法。在此示例中,str(mylist[2])str(mylist[[2]]) 的输出提供了对它们不同数据结构的更多了解。

一般来说,列表与其内容无关,因此单个列表可能包含其他列表、data.frames、矩阵和原子向量作为单独的元素。正如@joran 在他的评论中开玩笑说的那样,这就是火车类比被拉伸的地方,也许有点过分了。但是,一旦您对列表的第一级感到满意,其他嵌套列表的行为方式相同。 (也许嵌套列表是火车车厢内携带的盒子?)

旁注
str 函数是我最喜欢的用于检查列表和 data.frames(具有共同长度的原子向量的列表)的函数之一。我经常在阅读 .csv、.dta 或其他文件后使用它来检查列表结构。用户在调试代码时学习 R(以及有经验的用户)的一个常见障碍是记住他们正在使用什么数据结构,以及需要什么数据结构作为参数或什么数据结构是函数的输出。 strtypeofclass 是解决此问题的出色工具套件。

这个答案得益于来自 @42、@nicola、@joran、@jogo 和 @richard-scriven 的 cmets。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-08-18
  • 2013-05-20
  • 2021-01-24
  • 1970-01-01
  • 2013-11-18
  • 2019-05-13
  • 2019-11-26
  • 2021-10-15
相关资源
最近更新 更多