我用来比较两个列表,一个列表包含数值%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)
有谁知道为什么会这样?这真的令人困惑,我完全不明白为什么会发生这种情况。
这有点棘手。使用(打印显示)%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方法以稍微更有原则的方式执行字符之前的数字强制转换...