R-使用超出列表长度的双括号索引时出错的原因

时间:2018-12-19 15:17:30

标签: r indexing subset

使用单括号,大于列表长度的索引将返回包含单个元素的列表:NULL。 使用不存在的名称进行索引将返回相同的结果。

x <- as.list(1:10)

x[11]
# [[1]]
# NULL

x["i"]
# [[1]]
# NULL

我希望像[[NULL一样,用x[["i"]]编制索引以返回值x$i。 但是,使用超出列表长度的数字进行[[索引将返回错误。

x[["i"]]
# NULL

x$i
# NULL

x[[11]]
# Error in x[[11]] : subscript out of bounds

造成差异的原因是什么?为什么仅在这种情况下而不是当字符串索引与元素名称不匹配时抛出错误?

与现有问题的区别

为了澄清,我不是在问何时使用[[[$。我知道[[$只能用于访问单个列表元素的内容。我的问题是关于为什么数字索引大于列表长度而失败,并且错误仅针对[[

用不同的措词:如果x[[11]]使用“下标超出范围”,x[11]为何表现不一样?

我不认为这个问题重复。尽管this question讨论了相同的运算符,但我尚未阅读的答案都直接解决了我要询问的NULL和错误差异。

1 个答案:

答案 0 :(得分:0)

通过[1]["i"]访问列表时,您仍在处理列表。如果您通过[[1]]访问,则将检索列表的第一个元素内的值。

l=vector("list",10)
class(l["i"])
[1] "list"
class(l[1])
[1] "list"
class(l[[1]])
[1] "NULL"

如果要测试包含数字的列表:

l[[1]]=1
class(l[[1]])
[1] "numeric"

总结一下,使用前两个运算符可以显示列表在该特定位置所拥有的内容。使用[[]],您可以显示事物其自身