没有完全回答为什么,而是试图阐明什么。
让我们从创建一些数字序列开始:
x <- 1:10
z <- c(1,2,3,4,5,6,7,8,9,10)
typeof(x)
# [1] "integer"
typeof(z)
# [1] "double"
class(x)
# [1] "integer"
class(z)
# [1] "numeric"
正如@docendodiscimus 所指出的,它们可能看起来相同,但它们是不同的。如果您检查它们是否相同,这一点很重要:
identical(x,z)
# [1] FALSE
x == z
# [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
虽然== 是“允许比较原子向量中的值的二元运算符”。 (请参阅?==),identical() 是“测试两个对象是否完全相等的安全可靠的方法。在这种情况下它返回 TRUE,在其他情况下返回 FALSE。” (见?identical)。
当你比较seq()的结果时,这变得更加引人注目
y1 <- seq(1,10) # which is the equivalent to 1:10 (see ?`:`)
y2 <- seq(1,10, by = 1)
typeof(y1)
# [1] "integer"
typeof(y2)
# [1] "double"
class(y1)
# [1] "integer"
class(y2)
# [1] "numeric"
由于缺少by = ... 参数1 is assumed,因此整数向量足以表示序列。
除了完全令人困惑之外,这可能都是由于设计问题造成的(这是我所能理解的为什么)。因此,help 中声明了
“程序员不应该依赖于哪个”[序列属于哪个类型或类]
但是,所有向量的mode 是numeric
mode(y1)
# [1] "numeric"
mode(y2)
# [1] "numeric"
mode(x)
# [1] "numeric"
mode(z)
# [1] "numeric"
有关这种疯狂行为的更多信息,您应该查看this section in The R Inferno(实际上,整本书都值得一读)。
要解决此问题,您可以考虑将 not so integery 整数的 z 向量强制转换为 true 整数
z <- as.integer(c(1,2,3,4,5,6,7,8,9,10))
typeof(z)
# [1] "integer"
class(z)
# [1] "integer"
identical(x,z)
# [1] TRUE