Was ist der Unterschied zwischen "1L" und "1"?


152

Ich gesehen oft das Symbol 1L(oder 2L, 3Lusw.) erscheinen in R - Code. Was ist der Unterschied zwischen 1Lund 1? 1==1Lbewertet zu TRUE. Warum wird 1Lin R-Code verwendet?


18
Hinweis: 1 == 1Lgibt TRUE, identical(1, 1L)gibt aber FALSE.
CJB

Antworten:


129

Also erklärten @James und @Brian, was 3L bedeutet. Aber warum würdest du es benutzen?

Meistens macht es keinen Unterschied - aber manchmal können Sie damit Ihren Code schneller ausführen und weniger Speicher verbrauchen . Ein doppelter ("numerischer") Vektor verwendet 8 Bytes pro Element. Ein ganzzahliger Vektor verwendet nur 4 Bytes pro Element. Bei großen Vektoren ist dies weniger verschwendeter Speicher und weniger Zeit für die CPU (daher ist es normalerweise schneller).

Dies gilt hauptsächlich für die Arbeit mit Indizes. Hier ist ein Beispiel, in dem das Hinzufügen von 1 zu einem ganzzahligen Vektor ihn in einen Doppelvektor verwandelt:

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) 

... aber beachten Sie auch, dass übermäßiges Arbeiten mit ganzen Zahlen gefährlich sein kann:

1e9L * 2L # Works fine; fast lean and mean!
1e9L * 4L # Ooops, overflow!

... und wie @Gavin betonte, liegt der Bereich für ganze Zahlen ungefähr bei -2e9 bis 2e9.

Eine Einschränkung ist jedoch, dass dies für die aktuelle R-Version (2.13) gilt. R könnte dies irgendwann ändern (64-Bit-Ganzzahlen wären süß, was Vektoren mit einer Länge> 2e9 ermöglichen könnte). Um sicher zu gehen, sollten Sie verwenden, .Machine$integer.maxwann immer Sie den maximalen ganzzahligen Wert benötigen (und diesen für den minimalen negieren).


1
Ich denke, die Speicheranforderungen von R sind unabhängig vom Typ gleich, zumindest entsprechend object.size. Es ist nützlich, an Fortran- oder C-Code zu übergeben, für den möglicherweise Daten eines bestimmten Typs erforderlich sind.
James

2
Nein, versuchen object.size(1:100)vs. object.size(1:100+0)es 400 Bytes ist + einige Overhead vs. 800 Bytes + einige Overhead. Ich habe das obige Beispiel aktualisiert.
Tommy

2
Erwähnenswert ist, dass der Integer-Überlauf auf die Verwendung von 32-Bit-Ganzzahlen mit Vorzeichen zurückzuführen ist und daher auf etwa +/- 2 * 10 ^ 9 beschränkt ist, selbst auf 64-Bit-R ...
Gavin Simpson

1
@Zach es ist auch viel kürzer zu tippen :-)
Gavin Simpson

1
@ Gavin Simpson natürlich. Ich dachte wirklich von der Situation , wo Sie einen ganzen Vektor erstellen, wie c(1L, 2L, 3L, 4L,...100L)vs as.integer(c(1, 2, 3, 4,...100)).
Zach

54

Aus dem Abschnitt Konstanten der R-Sprachdefinition :

Wir können das Suffix 'L' verwenden, um eine beliebige Zahl zu qualifizieren, um sie zu einer expliziten Ganzzahl zu machen. '0x10L' erzeugt also den ganzzahligen Wert 16 aus der hexadezimalen Darstellung. Die Konstante 1e3L gibt 1000 als Ganzzahl und nicht als numerischen Wert an und entspricht 1000L. (Beachten Sie, dass das 'L' so behandelt wird, dass es den Term 1e3 und nicht den 3. qualifiziert.) Wenn wir einen Wert mit 'L' qualifizieren, der kein ganzzahliger Wert ist, z. B. 1e-3L, erhalten wir eine Warnung und der numerische Wert ist erstellt. Eine Warnung wird auch erstellt, wenn die Zahl einen unnötigen Dezimalpunkt enthält, z. B. 1.L.


46

L gibt einen ganzzahligen Typ an und nicht ein Double, das die numerische Standardklasse ist.

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

2

Um explizit einen ganzzahligen Wert für eine Konstante zu erstellen, können Sie die Funktion als Ganzzahl aufrufen oder einfach das Suffix "L" verwenden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.