J'ai souvent vu le symbole 1L
(ou 2L
, 3L
, etc.) apparaissent dans le code R. Quelle est la différence entre 1L
et 1
? 1==1L
est évalué à TRUE
. Pourquoi est-ce 1L
utilisé dans le code R?
Ainsi, @James et @Brian ont expliqué quoi 3L signifie. Mais pourquoi l'utiliseriez-vous?
La plupart du temps, cela ne fait aucune différence - mais vous pouvez parfois l'utiliser pour obtenir votre code plus rapidement et consommer ) moins de mémoire . Un vecteur double ("numérique") utilise 8 octets par élément. Un vecteur entier utilise seulement 4 octets par élément. Pour les gros vecteurs, cela représente moins de mémoire perdue et moins de temps à parcourir pour le processeur (donc, il est généralement plus rapide).
Cela s’applique généralement lorsque vous travaillez avec des index. Voici un exemple où ajouter 1 à un vecteur entier le transforme en un double vecteur:
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)
... mais notez aussi que travailler de manière excessive avec des entiers peut être dangereux:
1e9L * 2L # Works fine; fast lean and mean!
1e9L * 4L # Ooops, overflow!
... et comme l'a souligné @Gavin, l'intervalle pour les entiers est d'environ -2e9 à 2e9.
Une mise en garde cependant est que cela s'applique à la version actuelle de R (2.13). R pourrait changer cela à un moment donné (les entiers 64 bits seraient doux, ce qui pourrait permettre des vecteurs de longueur> 2e9). Pour être en sécurité, vous devez utiliser .Machine$integer.max
chaque fois que vous avez besoin de la valeur entière maximale (et la nier pour le minimum).
De la Section des constantes de la Définition du langage R :
Nous pouvons utiliser le suffixe "L" pour qualifier un nombre avec l’intention de le transformer en un entier explicite. Donc, "0x10L" crée la valeur entière 16 à partir de la représentation hexadécimale. La constante 1e3L donne 1000 sous la forme d'un entier plutôt que d'une valeur numérique et équivaut à 1000L. (Notez que le "L" est traité comme qualifiant le terme 1e3 et non le 3.) Si nous qualifions une valeur avec "L" qui n’est pas une valeur entière, par ex. 1e-3L, nous recevons un avertissement et la valeur numérique est créée. Un avertissement est également créé s’il existe un point décimal inutile dans le nombre, par ex. 1.L.
L spécifie un type entier, plutôt qu'un double de la classe numérique standard.
> str(1)
num 1
> str(1L)
int 1
Pour créer explicitement une valeur entière pour une constante, vous pouvez appeler la fonction as.integer ou plus simplement utiliser le suffixe "L".