为什么R字符和数字向量在某些上下文中相等?

问题描述 投票:2回答:2

我注意到在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

r list types type-equivalence
2个回答
2
投票

阅读最近的帖子: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

您尝试的其他操作不关心这些强制规则。


1
投票

对于带有列表索引的示例,请比较基本子集函数的文档:?`[`

索引是数字或字符向量或空(缺失)或NULL。数字值被强制转换为整数,因为as.integer(因此截断为零)。字符向量将与对象的名称(或矩阵/数组,dimnames)匹配:有关更多详细信息,请参阅下面的“字符索引”。

请注意,正如您在问题中所期望的那样,这并未说明强制转换为字符的整数向量。您的工作示例成功,因为列表名称('1','2')与整数索引匹配。后者失败,因为没有带有整数索引23的列表元素。

© www.soinside.com 2019 - 2024. All rights reserved.