Ho visto spesso il simbolo 1L
(o 2L
, 3L
ecc) appaiono nel codice R. Qual è la differenza tra 1L
e 1
? 1==1L
valuta TRUE
. Perché viene 1L
utilizzato nel codice R?
Ho visto spesso il simbolo 1L
(o 2L
, 3L
ecc) appaiono nel codice R. Qual è la differenza tra 1L
e 1
? 1==1L
valuta TRUE
. Perché viene 1L
utilizzato nel codice R?
Risposte:
Quindi, @James e @Brian hanno spiegato cosa significa 3L. Ma perché dovresti usarlo?
Il più delle volte non fa differenza, ma a volte puoi usarlo per far funzionare il tuo codice più velocemente e consumare meno memoria . Un vettore doppio ("numerico") utilizza 8 byte per elemento. Un vettore intero utilizza solo 4 byte per elemento. Per i vettori di grandi dimensioni, è meno memoria sprecata e meno guadagni per la CPU (quindi in genere è più veloce).
Principalmente questo vale quando si lavora con indici. Ecco un esempio in cui l'aggiunta di 1 a un vettore intero lo trasforma in un doppio vettore:
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)
... ma nota anche che lavorare eccessivamente con numeri interi può essere pericoloso:
1e9L * 2L # Works fine; fast lean and mean!
1e9L * 4L # Ooops, overflow!
... e come ha sottolineato @Gavin, l'intervallo per i numeri interi è approssimativamente da -2e9 a 2e9.
Un avvertimento è che questo vale per l'attuale versione R (2.13). R potrebbe cambiare questo ad un certo punto (i numeri interi a 64 bit sarebbero dolci, il che consentirebbe vettori di lunghezza> 2e9). Per sicurezza, dovresti usare .Machine$integer.max
ogni volta che hai bisogno del massimo valore intero (e negalo per il minimo).
object.size
. Ciò per cui è utile è passare a Fortran o al codice C che potrebbe richiedere dati di un tipo particolare.
object.size(1:100)
contro i object.size(1:100+0)
suoi 400 byte + un certo overhead contro 800 byte + un po 'overhead. Ho aggiornato l'esempio sopra.
c(1L, 2L, 3L, 4L,...100L)
vs as.integer(c(1, 2, 3, 4,...100))
.
Dalla sezione Costanti della definizione del linguaggio R :
Possiamo usare il suffisso "L" per qualificare qualsiasi numero con l'intento di renderlo un numero intero esplicito. Quindi '0x10L' crea il valore intero 16 dalla rappresentazione esadecimale. La costante 1e3L fornisce 1000 come numero intero anziché come valore numerico ed equivale a 1000L. (Nota che la 'L' viene considerata qualificante il termine 1e3 e non il 3.) Se qualifichiamo un valore con 'L' che non è un valore intero, ad esempio 1e-3L, riceviamo un avviso e il valore numerico è creato. Viene inoltre creato un avviso se nel numero è presente un punto decimale non necessario, ad es. 1.L.
Per creare esplicitamente un valore intero per una costante è possibile chiamare la funzione as.integer o più semplicemente usare il suffisso "L".
1 == 1L
dàTRUE
, maidentical(1, 1L)
dàFALSE
.