比较数字和整数值有时给出 TRUE,有时给出 FALSE

Hon*_*ore 4 integer r numeric

我用来比较两个列表,一个列表包含数值%in%向量,另一个列表包含相应的整数值。结果真的很奇怪;有时有时,我不明白为什么。TRUEFALSE

例如下面的代码给出TRUE

list(c(1, 1)) %in% list(c(1L, 1L))
Run Code Online (Sandbox Code Playgroud)

但是,如果我们将向量中的第二个数字更改为 2 和 2L,我们会得到FALSE

list(c(1, 2)) %in% list(c(1L, 2L))
Run Code Online (Sandbox Code Playgroud)

将第二个数字更改为 3 或 4TRUE再次给出。

list(c(1, 3)) %in% list(c(1L, 3L))
list(c(1, 4)) %in% list(c(1L, 4L))
Run Code Online (Sandbox Code Playgroud)

再次使用其他一些值会产生结果FALSE,但我看不到任何模式。例如,使用 8 和 9 结果为FALSE

list(c(8, 9)) %in% list(c(8L, 9L))
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么会这样?这真的令人困惑,我完全不明白为什么会发生这种情况。

Ben*_*ker 7

这有点棘手。使用(打印显示)%in%实现,并说match()`%in%`match(x, table, nomatch = 0L) > 0L?match

因子、原始向量和列表转换为字符向量

比较之前。现在我们来比较一下:

  • as.character(list(c(1,1)))是“c(1,1)”(与整数等价相同)
  • as.character(list(c(1,2)))是“c(1,2)”
  • 但是...as.character(list(c(1L, 2L)))是“1:2”(!),因为 R 将连续整数序列识别为可以折叠为替代/紧凑表示形式 (ALTREP) 的序列

(另一个例子as.character(list(7L, 8L, 9L))是“7:9”,而不是“c(7,8,9)”)

作为解决方法,您可以使用以下命令显式转换向量as.numeric()

您还可以(按照@user2554330的建议)向您的列表添加一个类属性(class(L) <- c("mylist", "list"))并定义一个mtfrm.mylist方法以稍微更有原则的方式执行字符之前的数字强制转换...

  • 将类添加到列表中可以让您通过为该类定义“mtfrm”方法来更改比较方法。 (2认同)