r - stima - ℮




Qual è la differenza tra `1L` e` 1`? (3)

Ho visto spesso il simbolo 1L (o 2L , 3L , ecc.) Apparire nel codice R. Qual è la differenza tra 1L e 1 ? 1==1L restituisce TRUE . Perché 1L è utilizzato nel codice R?


Dalla sezione Costanti della definizione della lingua R :

Possiamo usare il suffisso 'L' per qualificare qualsiasi numero con l'intento di renderlo un intero esplicito. Quindi '0x10L' crea il valore intero 16 dalla rappresentazione esadecimale. La costante 1e3L dà 1000 come numero intero anziché come valore numerico ed equivale a 1000L. (Si noti che la 'L' viene trattata come qualificante con il termine 1e3 e non con il 3.) Se si qualifica un valore con 'L' che non è un valore intero, ad esempio 1e-3L, si ottiene un avviso e il valore numerico è creato. Viene inoltre generato un avviso se nel numero è presente un punto decimale non necessario, ad es. 1.L.


L specifica un tipo intero, piuttosto che un doppio della classe numerica standard.

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

Quindi, @James e @Brian hanno spiegato cosa significa 3L. Ma perché dovresti usarlo?

Il più delle volte non fa alcuna differenza, ma a volte è possibile utilizzarlo per far funzionare il 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 sprecata memoria e meno guadare attraverso la CPU (quindi è in genere più veloce).

Principalmente questo si applica 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 troppo con gli interi può essere pericoloso:

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

... e come ha sottolineato @Gavin, l'intervallo per gli interi è all'incirca tra -2e9 e 2e9.

Un avvertimento è che questo si applica alla versione R corrente (2.13). R potrebbe cambiarlo a un certo punto (gli interi a 64 bit sarebbero dolci, il che potrebbe abilitare i vettori di lunghezza> 2e9). Per sicurezza, si dovrebbe usare .Machine$integer.max ogni volta che si ha bisogno del valore intero massimo (e lo si nega per il minimo).





types