ggplot - ¿Cuál es la diferencia entre `1L` y` 1`?
r plot legend (4)
De la sección de constantes de la definición de lenguaje R :
Podemos usar el sufijo ''L'' para calificar cualquier número con la intención de convertirlo en un entero explícito. Entonces ''0x10L'' crea el valor entero 16 a partir de la representación hexadecimal. La constante 1e3L da 1000 como un número entero en lugar de un valor numérico y es equivalente a 1000L. (Tenga en cuenta que la ''L'' se considera calificar el término 1e3 y no el 3.) Si calificamos un valor con ''L'' que no es un valor entero, por ejemplo 1e-3L, recibimos una advertencia y el valor numérico es creado. También se crea una advertencia si hay un punto decimal innecesario en el número, por ejemplo, 1.L.
A menudo veo el símbolo 1L
(o 2L
, 3L
, etc.) aparecer en el código R. ¿Cuál es la diferencia entre 1L
y 1
? 1==1L
evalúa como TRUE
. ¿Por qué se usa 1L
en el código R?
Entonces, @James y @Brian explicaron qué significa 3L. ¿ Pero por qué lo usarías?
La mayoría de las veces no hace ninguna diferencia, pero a veces puede usarlo para que su código se ejecute más rápido y consuma menos memoria . Un vector doble ("numérico") usa 8 bytes por elemento. Un vector entero usa solo 4 bytes por elemento. Para vectores grandes, se trata de una memoria menos desperdiciada y menos para la CPU (por lo que suele ser más rápida).
Principalmente esto aplica cuando se trabaja con índices. Aquí hay un ejemplo donde al sumar 1 a un vector entero lo convierte en un vector doble:
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)
... pero también tenga en cuenta que trabajar excesivamente con enteros puede ser peligroso:
1e9L * 2L # Works fine; fast lean and mean!
1e9L * 4L # Ooops, overflow!
... y como @Gavin señaló, el rango para los enteros es aproximadamente -2e9 a 2e9.
Sin embargo, una advertencia es que esto se aplica a la versión R actual (2.13). R podría cambiar esto en algún momento (los enteros de 64 bits serían dulces, lo que podría permitir vectores de longitud> 2e9). Para estar seguro, debe usar .Machine$integer.max
cada vez que necesite el valor entero máximo (y anularlo por el mínimo).
L especifica un tipo entero, en lugar de un doble que la clase numérica estándar.
> str(1)
num 1
> str(1L)
int 1
Para crear explícitamente un valor entero para una constante, puede llamar a la función como.integer o más simplemente use el sufijo "L".