回答:
@Jamesと@Brianが3Lの意味を説明しました。しかし、なぜそれを使うのでしょうか?
ほとんどの場合、違いはありませんが、コードをより高速に実行し、メモリ消費を抑えるために使用できる場合もあります。二重(「数値」)ベクトルは、要素ごとに8バイトを使用します。整数ベクトルは、要素ごとに4バイトのみを使用します。大きなベクトルの場合、メモリの浪費が少なくなり、CPUを無駄にする必要が少なくなります(そのため、通常は高速です)。
ほとんどの場合、これはインデックスを操作するときに適用されます。以下は、整数ベクトルに1を追加すると、それがdoubleベクトルに変わる例です。
x <- 1:100
typeof(x) # integer
y <- x+1
typeof(y) # double, twice the memory size
object.size(y) # 840 bytes (on win64)
z <- x+1L
typeof(z) # still integer
object.size(z) # 440 bytes (on win64)
...しかし、整数を過度に操作することは危険である可能性があることにも注意してください:
1e9L * 2L # Works fine; fast lean and mean!
1e9L * 4L # Ooops, overflow!
...そして@Gavinが指摘したように、整数の範囲はおよそ-2e9から2e9です。
ただし、これは現在のRバージョン(2.13)に適用されることに注意してください。Rは、ある時点でこれを変更する可能性があります(64ビットの整数は、長さが2e9を超えるベクトルを有効にする可能性があります)。安全のために.Machine$integer.max
、最大整数値が必要な場合は常に使用する必要があります(最小値の場合はそれを無効にします)。
object.size
。それが有用なのは、特定のタイプのデータを必要とする可能性があるFortranまたはCコードに渡すことです。
object.size(1:100)
対object.size(1:100+0)
それは400バイト+オーバーヘッド対800バイト+いくつかのオーバーヘッドがあります。上記の例を更新しました。
c(1L, 2L, 3L, 4L,...100L)
vsのようなベクトル全体を作成する状況を本当に考えていましたas.integer(c(1, 2, 3, 4,...100))
。
1 == 1L
は与えますTRUE
が、identical(1, 1L)
与えFALSE
ます。