了解以下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"
答案 0 :(得分: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)]]
返回一个&#34;下标超出范围&#34;错误。只能一次提取一个列表元素(即每个函数调用)。
@ richard-scriven提醒我一个关于Hadley Wickham twitter post的链接,提供了一个照片形式的嵌套列表的附加类比。
使用相当简单的列表结构,str
是了解列表内容的好方法。在此示例中,str(mylist[2])
和str(mylist[[2]])
的输出提供了对其不同数据结构的进一步了解。
通常,列表与其内容无关,因此单个列表可能包含其他列表,data.frames,矩阵和原子向量作为单独的元素。正如@joran在他的评论中开玩笑说的那样,火车类比得到了拉伸,可能有点太多了。但是,一旦您熟悉列表的第一级,其他嵌套列表的行为方式相同。 (也许嵌套列表是火车车厢内的箱子?)
旁注:
我最喜欢的用于检查列表和data.frames(具有常见长度的原子向量的列表)的函数之一是str
函数。我在读取.csv,.dta或其他文件后经常使用它来检查列表结构。用户在调试代码时学习R(以及有经验的用户)的常见障碍是牢记他们正在使用什么数据结构以及需要什么数据结构作为参数或什么数据结构是函数的输出。 str
以及typeof
和class
是解决此问题的绝佳工具套件。
这个答案得益于@ 42,@ nicola,@ joran,@ jogo和@ richard-scriven的评论。