Quelle est la différence entre 1L et 1?

J’ai souvent vu le symbole 1L (ou 2L , 3L , etc.) apparaître dans le code R. Quelle est la différence entre 1L et 1 ? 1==1L évalué à TRUE . Pourquoi 1L est-il utilisé dans le code R?

Donc, @James et @Brian ont expliqué ce que 3L signifie. Mais pourquoi l’utiliseriez-vous?

La plupart du temps, cela ne fait aucune différence, mais vous pouvez parfois l’utiliser pour que votre code s’exécute plus rapidement et consum 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, c’est moins de mémoire gaspillée et moins de chemin à parcourir pour le CPU (donc c’est généralement plus rapide).

Cela s’applique principalement au travail avec des index. Voici un exemple où l’ajout de 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 également que travailler excessivement avec des nombres entiers peut être dangereux:

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

... et comme @Gavin l'a fait remarquer, l'intervalle pour les entiers est d'environ -2e9 à 2e9.

Une mise en garde est que cela s'applique à la version R actuelle (2.13). R pourrait changer cela à un moment donné (les entiers de 64 bits seraient doux, ce qui pourrait permettre des vecteurs de longueur> 2e9). Pour être sûr, vous devez utiliser .Machine$integer.max chaque fois que vous avez besoin de la valeur entière maximale (et la supprimer au minimum).

De la section Constantes de la définition du langage R :

Nous pouvons utiliser le suffixe ‘L’ pour qualifier n’importe quel nombre avec l’intention d’en faire un entier explicite. Donc ‘0x10L’ crée la valeur entière 16 à partir de la représentation hexadécimale. La constante 1e3L donne 1000 comme un entier plutôt qu’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 exemple 1e-3L, nous obtenons un avertissement et la valeur numérique est créé. Un avertissement est également créé s’il existe un point décimal inutile dans le nombre, par exemple 1.L.

L spécifie un type entier plutôt qu’un double que représente 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”.