我不知道为什么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
为什么?救命!
答案 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
的第一个元素内的列表的第二个元素的第三个元素。该元素显然不存在,因此会出现错误。
为进一步演示,还有两个示例:
integerList[[c(1, 3)]]
#[1] 3
在这里,我们正在访问integerList
的第一个元素的第三个元素。
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