【问题标题】:Why are vectors created by ':' integer?为什么向量是由 ':' 整数创建的?
【发布时间】:2017-12-23 04:50:28
【问题描述】:

为什么使用integer 类型的: 创建向量和使用double 类型的c() 创建向量?

a <- 1:7
typeof(a)
# "integer"
class(a)
# "integer"
b <- c(1,2,3,4,5,6,7)
typeof(b)
# "double"
class(b)
# "numeric"

【问题讨论】:

  • 我猜这主要是一个设计决定。如果要创建整数向量而不使用冒号运算符,可以使用c(1L,2L,3L,4L,5L,6L,7L)
  • @docendodiscimus 我很困惑,因为两个向量具有相同的值但它们属于不同的类型。
  • 它们可能看起来一样,但它们并不相同
  • 构造整数序列的替代方法是seq_len(7)seq(1, 7)
  • 并非所有: 创建的向量都是整数:考虑1.5:8.4

标签: r types integer numeric


【解决方案1】:

没有完全回答为什么,而是试图阐明什么
让我们从创建一些数字序列开始:

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 中声明了

“程序员不应该依赖于哪个”[序列属于哪个类型或类]

但是,所有向量的modenumeric

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

【讨论】:

  • 为了增加混乱,请尝试y3 &lt;- seq(1, 10, by = 1L)y4 &lt;- seq(1L, 10, by = 1L)
  • 似乎“程序员不应该依赖文档中的哪个”是有充分理由的 :)
  • 你可能还提到 from:to 等价于 seq(from,to)。这可以使答案更加引人注目。
猜你喜欢
  • 2015-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
相关资源
最近更新 更多