数字

数字表示整数和双精度,是分配给数字向量的默认模式。函数 is.numeric() 将评估向量是否为数字。重要的是要注意虽然整数和双精度将通过 is.numeric(),但函数 as.numeric() 将始终尝试转换为 double 类型。

x <- 12.3
y <- 12L

#confirm types
typeof(x)
[1] "double"
typeof(y)
[1] "integer"

# confirm both numeric
is.numeric(x)
[1] TRUE
is.numeric(y)
[1] TRUE

# logical to numeric
as.numeric(TRUE)
[1] 1

# While TRUE == 1, it is a double and not an integer
is.integer(as.numeric(TRUE))
[1] FALSE

双打是 R 的默认数值。它们是双精度向量,意味着它们为向量中的每个值占用 8 个字节的内存。R 没有单精度数据类型,因此所有实数都以双精度格式存储。

is.double(1)
TRUE
is.double(1.0)
TRUE
is.double(1L)
FALSE

整数是可以在没有小数分量的情况下编写的整数。整数用后面带有 L 的数字表示。任何没有 L 的数字都会被认为是双数。

typeof(1)
[1] "double"
class(1)
[1] "numeric"
typeof(1L)
[1] "integer"
class(1L)
[1] "integer"

虽然在大多数情况下使用整数或双精度无关紧要,但有时用整数替换双精度会消耗更少的内存和运算时间。双向量每个元素使用 8 个字节,而整数向量每个元素仅使用 4 个字节。随着向量的增加,使用适当的类型可以大大加快进程。

#  test speed on lots of arithmetic
microbenchmark(
  for( i in 1:100000){
  2L * i
  10L + i
},

for( i in 1:100000){
  2.0 * i
  10.0 + i
}
)
Unit: milliseconds
                                          expr      min       lq     mean   median       uq      max neval
 for (i in 1:1e+05) {     2L * i     10L + i } 40.74775 42.34747 50.70543 42.99120 65.46864 94.11804   100
   for (i in 1:1e+05) {     2 * i     10 + i } 41.07807 42.38358 53.52588 44.26364 65.84971 83.00456   100