【问题标题】:Why are R character and numeric vectors equal in certain contexts?为什么在某些情况下 R 字符和数字向量相等?
【发布时间】:2018-11-16 05:13:00
【问题描述】:

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


【解决方案1】:

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

您尝试的其他操作不受这些强制规则的影响。

【讨论】:

    【解决方案2】:

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

    索引是数字或字符向量或空(缺失)或 NULL。 数值被 as.integer 强制转换为整数(因此 向零截断)。字符向量将匹配到 对象的名称(或者对于矩阵/数组,dimnames):见 详情请参阅下方的“字符索引”。

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

    【讨论】:

      猜你喜欢
      • 2018-07-25
      • 1970-01-01
      • 2021-11-20
      • 2017-10-12
      • 2015-11-04
      • 2019-05-13
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多