R中的列表:实际情况是什么?

时间:2018-07-25 23:46:26

标签: r

我不知道为什么R表现如下。

integerList <- list(1:10)
integerList[[1]] # this works
integerList[[1:2]] # this works BUT WHY?
integerList[[1:3]] # this fails, as I would expect

integerList[[1:2]]为什么起作用(我认为应该失败),但是integerList[[1:3]]却失败(我认为应该如此)。当最后一行代码失败时,错误消息为:

Error in integerList[[1:3]] : recursive indexing failed at level 2

为什么?救命!

3 个答案:

答案 0 :(得分:2)

李哲源的comment说:

  

[[可以递归应用于列表,因此,如果单个索引i是长度为p的向量,则alist [[i]]等同于alist [[i1]] ... [[ip]],除最终索引外的所有索引都将生成一个列表。

,该内容取自[[的帮助页面。尝试?`[[`并向下看页面。

这意味着integerList[[1:2]]等效于integerList[[1]][[2]],它返回2(因为它是列表中第一个元素中向量的第二个元素)。显然2没有第三个元素,因此integerList[[1:3]](即integerList[[1]][[2]][[3]])失败了。

答案 1 :(得分:1)

integerList[[1:2]]中,您需要嵌套在integerList的第一个元素内的列表的第二个元素。向量只是R中的一个特殊列表,因此它返回第二个元素,即2。

integerList[[1:3]]中,您需要嵌套在integerList的第一个元素内的列表的第二个元素的第三个元素。该元素显然不存在,因此会出现错误。


为进一步演示,还有两个示例:

示例1

integerList[[c(1, 3)]]
#[1] 3

在这里,我们正在访问integerList的第一个元素的第三个元素。

示例2

integerList2 <- list(list(1:10, 11:20))
integerList2
#[[1]]
#[[1]][[1]]
# [1]  1  2  3  4  5  6  7  8  9 10
#
#[[1]][[2]]
# [1] 11 12 13 14 15 16 17 18 19 20

integerList2[[1:3]]
#[1] 13

这里我们正在访问integerList2的第一个元素的第二个元素的第三个元素。

答案 2 :(得分:0)

integerList[[1:2]]integerList[[1]][[2]]相同,即integerList的第一个元素的第二个元素

integerList[[1:3]]integerList[[1]][[2]][[3]]相同,即integerList的第一个元素的第二个元素的第三个元素

尝试

integerListoflists <- list(list(111:119,121:125),201:207)
integerListoflists[[1]][[2]][[3]]
integerListoflists[[1:3]]

同时获得两次

[1] 123

同时

integerListoflists[[1]][[2]]
integerListoflists[[1:2]]

给予

[1] 121 122 123 124 125