數字

數字表示整數和雙精度,是分配給數字向量的預設模式。函式 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