是否有合理的方式来考虑列表索引?

tha*_*nce 7 r list

理解下面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"
Run Code Online (Sandbox Code Playgroud)

lmo*_*lmo 7

一个简单的比喻是将列表视为火车.火车上的每辆车都装着东西.如果您拆除两辆车,那么您的火车将减少两辆车.如果你除了一辆车以外的所有车,它仍然是一辆单车的火车.

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

在您的示例中,mylist [2]是包含一个元素的mylist子列表.你可以用这个验证length(mylist[2]).如果参数有效,则该[函数将提供一个列表,其中包含与作为参数提供的数字或字符向量中的元素一样多的元素[.大多数情况下,我们有兴趣检查列表项的内容.这是通过该[[功能实现的.例如,mylist[[2]]是内容mylist[2],其本身是包含多个元素的列表.要看到这一点,试试吧length(mylist[[2]])

因为[可以认为是一个列表子集的功能和[[作为列表元素提取功能,mylist[1:2]mylist[c(1,2)]返回一个子列表(其等同于在此情况下MYLIST),而mylist[[1:2]]mylist[[c(1,2)]]返回一个"下标出界"错误.一次只能提取一个列表元素(即每个函数调用).

@ richard-scriven提醒我一个关于Hadley Wickham twitter帖子的链接,提供了一个类似于照片形式的嵌套列表的类比.

使用相当简单的列表结构,str可以很好地了解列表内容.在此示例中,输出str(mylist[2])str(mylist[[2]])提供有关其不同数据结构的其他信息.

通常,列表与其内容无关,因此单个列表可以包含其他列表,data.frames,矩阵和原子向量作为单独的元素.正如@joran在他的评论中开玩笑说的那样,火车类比会被拉长,可能有点太多了.但是,一旦您熟悉列表的第一级,其他嵌套列表的行为方式相同.(也许嵌套列表是火车车厢内的箱子?)

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

这个答案得益于@ 42,@ nicola,@ joran,@ jogo和@ richard-scriven的评论.

  • 也可以将它们指向一个很好的可视化https://twitter.com/hadleywickham/status/643381054758363136,虽然我永远不会把辣椒包放在胡椒瓶里.哈哈 (2认同)