为什么矢量是由':'创建的?整数?

时间:2017-07-18 10:54:53

标签: r types integer numeric

为什么使用editText.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.drawableRight, 0); 类型:创建的向量和使用integer类型的c()创建的向量?

double

1 个答案:

答案 0 :(得分:4)

不完全回答为什么,但试图阐明 的内容。
让我们从创建一些数字序列开始:

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(实际上,整本书都是一本很好的读物)。

要解决此问题,您可以考虑将 {em> 整数的z向量强制转换为 true 整数< / p>

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