Ich gesehen oft das Symbol 1L
(oder 2L
, 3L
usw.) erscheinen in R - Code. Was ist der Unterschied zwischen 1L
und 1
? 1==1L
bewertet zu TRUE
. Warum wird 1L
in R-Code verwendet?
Ich gesehen oft das Symbol 1L
(oder 2L
, 3L
usw.) erscheinen in R - Code. Was ist der Unterschied zwischen 1L
und 1
? 1==1L
bewertet zu TRUE
. Warum wird 1L
in R-Code verwendet?
Antworten:
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.max
wann immer Sie den maximalen ganzzahligen Wert benötigen (und diesen für den minimalen negieren).
object.size
. Es ist nützlich, an Fortran- oder C-Code zu übergeben, für den möglicherweise Daten eines bestimmten Typs erforderlich sind.
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.
c(1L, 2L, 3L, 4L,...100L)
vs as.integer(c(1, 2, 3, 4,...100))
.
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.
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.
1 == 1L
gibtTRUE
,identical(1, 1L)
gibt aberFALSE
.