为什么 "identical(c(1:3), c(1, 2, 3))" 是错误的?

6
为什么identical(c(1:3), c(1, 2, 3))是false?换句话说,前者为什么是整数而后者是浮点数?
2个回答

17
R> class(1:3)
[1] "integer"
R> class(c(1,2,3))
[1] "numeric"
R> 

简而言之,:作为序列操作符会返回整数,因为“这才是人们真正想要的”。

因此:

R> identical(1:3, c(1L,2L,3L))
[1] TRUE
R> identical(1*(1:3), c(1,2,3))
[1] TRUE
R> 

5

这涉及到冒号运算符。来自?':'help(':')

细节

二元运算符 : 有两个含义:对于因子 a:b 相当于 interaction(a, b)(但级别的排序和标记方式不同)。

对于其他参数,from:to 相当于 seq(from, to),并在步长为1或-1的情况下生成从 from 到 to 的序列。如果值 to 与 from 相差整数,且相差小于大约 1e-7 的数字模糊,则包括值 to。非数字参数在内部被强制转换为数字(因此没有调度方法)-复杂的值将带有警告而将其虚部舍弃。

对于数字参数,它是一个数字向量。如果 from 是整数值并且结果可以用 R 整数类型表示,则该向量将是整数类型;否则为 "double" 类型(也称为 "numeric" 模式)。


1
此外,从 seq() 的帮助中可以得知: "seq.int 和 seq 的默认方法对于数值参数返回一个类型为“integer”或“double”的向量:程序员不应该依赖于哪种类型。"换句话说,这是一个任意的选择。您可以通过在整数后附加“L”来明确定义整数:identical(1:3, c(1L, 2L, 3L)) - Calbers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接