R:与列表“匹配”中的行为不一致

R: Inconsistent behavior in `match` with lists

提问人:jblood94 提问时间:8/5/2023 最后编辑:jblood94 更新时间:8/5/2023 访问量:36

问:

match在使用 List 对象时给出不一致的结果:

match(list(c(1, 2)), list(c(1L, 2L)))
#> [1] NA
match(list(c(1, 3)), list(c(1L, 3L)))
#> [1] 1

是什么原因导致了这种情况?match

这不仅仅是 和 之间的区别:integernumeric

match(c(1, 2), c(1L, 2L))
#> [1] 1 2
match(c(1, 3), c(1L, 3L))
#> [1] 1 2

一些额外的例子。该行为似乎仅以顺序值显示:

match(list(c(100, 101, 102)), list(c(100L, 101L, 102L)))
#> [1] NA
match(list(c(100, 102, 101)), list(c(100L, 102L, 101L)))
#> [1] 1
match(list(c(2, 1)), list(c(2L, 1L)))
#> [1] NA
R 匹配

评论


答:

4赞 one 8/5/2023 #1

原因是 1,2 是连续的整数

在 的细节部分,它提到:?match

因子、原始向量和列表被转换为字符向量,然后 x 和 table 被强制转换为通用类型(R 排序中的两种类型中的较后者,逻辑<整数<数<复数<字符)。如果不可比性具有正长度,则强制为普通类型。

对于连续的整数,它们被解析为starting number: ending number

as.character(list(c(1L,2L)))
[1] "1:2"

as.character(list(c(100L, 101L, 102L)))
[1] "100:102"

其中作为另一个:

as.character(list(c(1L,3L)))
[1] "c(1, 3)"

as.character(list(c(1,2)))
[1] "c(1, 2)"

评论

0赞 jblood94 8/5/2023
是的,这在比较之前将列表对象转换为字符对象是有意义的。我没有意识到转换会使用冒号表示法,但这也是有道理的。谢谢!match