「1L」と「1」の違いは何ですか?


152

私は頻繁に記号を見て1L(または2L3Lなど)Rコードで表示されます。1Lとは1どう違いますか? 1==1Lはに評価されTRUEます。なぜ1LRコードで使用されるのですか?


18
注:1 == 1Lは与えますTRUEが、identical(1, 1L)与えFALSEます。
CJB 2015

回答:


129

@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、最大整数値が必要な場合は常に使用する必要があります(最小値の場合はそれを無効にします)。


1
少なくともによると、Rによるメモリ要件はタイプに関係なく同じだと思いますobject.size。それが有用なのは、特定のタイプのデータを必要とする可能性があるFortranまたはCコードに渡すことです。
ジェームズ

2
いや、してみてくださいobject.size(1:100)object.size(1:100+0)それは400バイト+オーバーヘッド対800バイト+いくつかのオーバーヘッドがあります。上記の例を更新しました。
トミー

2
整数のオーバーフローは32ビットの符号付き整数の使用に起因するため、64ビットのRであっても約+/- 2 * 10 ^ 9に制限されていることに言及する価値があります...
Gavin Simpson

1
@Zach入力する方がずっと短い:-)
Gavin Simpson

1
もちろん@ギャビンシンプソン。c(1L, 2L, 3L, 4L,...100L)vsのようなベクトル全体を作成する状況を本当に考えていましたas.integer(c(1, 2, 3, 4,...100))
Zach

54

から 定数節R言語の定義

「L」接尾辞を使用して、任意の数値を明示的な整数にする目的で修飾できます。したがって、「0x10L」は、16進数表現から整数値16を作成します。定数1e3Lは、数値ではなく整数として1000を与え、1000Lと同等です。( 'L'は3ではなく1e3という用語を修飾するものとして扱われることに注意してください。)整数値ではない 'L'で値を修飾すると、たとえば1e-3Lの場合、警告が表示され、数値は作成した。1.Lなど、数値に不要な小数点がある場合も警告が表示されます。


46

Lは、標準の数値クラスのdoubleではなく、整数型を指定します。

> str(1)
 num 1
> str(1L)
 int 1

2

定数の整数値を明示的に作成するには、as.integer関数を呼び出すか、より簡単に「L」接尾辞を使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.