我注意到在R
中,数字的字符向量等价于它们对应的数字向量。
"1234" == 1234
# [1] TRUE
c("1", "2", "3") == 1:3
# [1] TRUE TRUE TRUE
all(c("1", "2", "3") == 1:3)
# [1] TRUE
当使用all.equal()
时,我们得到一个消息,模式是不同的。
all.equal(c("1", "2"), c(1, 2))
# [1] "Modes: character, numeric" "target is character, current is numeric"
使用列表时,这会变得更加复杂。
myList <- list("1"="a", "2"=c("b", "c"))
myList[c("2", "1")]
# $`2`
# [1] "b" "c"
#
# $`1`
# [1] "a"
myList[2:1]
# $`2`
# [1] "b" "c"
#
# $`1`
# [1] "a"
myList[[2]]
# [1] "b" "c"
此时,可以推断在访问列表时可以互换地使用数字和字符向量。但是之后...
myList2 <- list("1"="a", "23"=c("b", "c"))
myList2[c(23, 1)]
# $<NA>
# NULL
#
# $`1`
# [1] "a"
myList2[[23]]
# Error in myList2[[23]] : subscript out of bounds
myList2[["23"]]
# [1] "b" "c"
这种行为有什么解释?
R版本3.5.0
阅读最近的帖子:Why does as.numeric(1) == (3 | 4) evaluate to TRUE?
特别是:
coercion rules for comparison operators(?Comparison
)告诉我们:
如果两个参数是不同类型的原子向量,则一个被强制为另一个的类型,优先级(递减)顺序为字符,复数,数字,整数,逻辑和原始。
所以1 == '1'
真的比较as.character(1) == '1'
,这是'1' == '1'
,这是TRUE
。
您尝试的其他操作不关心这些强制规则。
对于带有列表索引的示例,请比较基本子集函数的文档:?`[`
索引是数字或字符向量或空(缺失)或NULL。数字值被强制转换为整数,因为as.integer(因此截断为零)。字符向量将与对象的名称(或矩阵/数组,dimnames)匹配:有关更多详细信息,请参阅下面的“字符索引”。
请注意,正如您在问题中所期望的那样,这并未说明强制转换为字符的整数向量。您的工作示例成功,因为列表名称('1','2')与整数索引匹配。后者失败,因为没有带有整数索引23的列表元素。