Muitas vezes eu vi o símbolo 1L
(ou 2L
, 3L
, etc) aparecem no código R. Qual é a diferença entre 1L
e 1
? 1==1L
avalia como TRUE
. Por que é 1L
usado no código R?
Muitas vezes eu vi o símbolo 1L
(ou 2L
, 3L
, etc) aparecem no código R. Qual é a diferença entre 1L
e 1
? 1==1L
avalia como TRUE
. Por que é 1L
usado no código R?
Respostas:
Então, @ James e @ Brian explicaram o que 3L significa. Mas por que você usaria?
Na maioria das vezes, não faz diferença - mas às vezes você pode usá-lo para fazer com que seu código seja executado mais rapidamente e consuma menos memória . Um vetor duplo ("numérico") usa 8 bytes por elemento. Um vetor inteiro usa apenas 4 bytes por elemento. Para vetores grandes, isso significa menos memória desperdiçada e menos espaço para a CPU (por isso é geralmente mais rápido).
Isso se aplica principalmente ao trabalhar com índices. Aqui está um exemplo em que adicionar 1 a um vetor inteiro o transforma em um vetor duplo:
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)
... mas observe também que trabalhar excessivamente com números inteiros pode ser perigoso:
1e9L * 2L # Works fine; fast lean and mean!
1e9L * 4L # Ooops, overflow!
... e como @Gavin apontou, o intervalo para números inteiros é aproximadamente -2e9 a 2e9.
Uma ressalva é que isso se aplica à versão R atual (2.13). R pode mudar isso em algum momento (números inteiros de 64 bits seriam bons, o que poderia permitir vetores de comprimento> 2e9). Para estar seguro, você deve usá- .Machine$integer.max
lo sempre que precisar do valor inteiro máximo (e negar isso pelo mínimo).
object.size
. É útil passar para o código Fortran ou C, que pode exigir dados de um tipo específico.
object.size(1:100)
contra object.size(1:100+0)
400 bytes + alguma sobrecarga vs. 800 bytes + alguma sobrecarga. Eu atualizei o exemplo acima.
c(1L, 2L, 3L, 4L,...100L)
vs as.integer(c(1, 2, 3, 4,...100))
.
Da seção Constantes da definição de linguagem R :
Podemos usar o sufixo 'L' para qualificar qualquer número com a intenção de torná-lo um número inteiro explícito. Então '0x10L' cria o valor inteiro 16 a partir da representação hexadecimal. A constante 1e3L fornece 1000 como um número inteiro em vez de um valor numérico e é equivalente a 1000L. (Observe que o 'L' é tratado como qualificando o termo 1e3 e não o 3.) Se qualificarmos um valor com 'L' que não seja um valor inteiro, por exemplo, 1e-3L, recebemos um aviso e o valor numérico é criada. Um aviso também é criado se houver um ponto decimal desnecessário no número, por exemplo, 1.L.
Para criar explicitamente um valor inteiro para uma constante, você pode chamar a função como.integer ou, mais simplesmente, usar o sufixo "L".
1 == 1L
dáTRUE
, masidentical(1, 1L)
dáFALSE
.