Qual é a diferença entre `1L` e` 1`?


152

Muitas vezes eu vi o símbolo 1L(ou 2L, 3L, etc) aparecem no código R. Qual é a diferença entre 1Le 1? 1==1Lavalia como TRUE. Por que é 1Lusado no código R?


18
Nota: 1 == 1LTRUE, mas identical(1, 1L)FALSE.
CJB

Respostas:


129

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.maxlo sempre que precisar do valor inteiro máximo (e negar isso pelo mínimo).


1
Eu acho que os requisitos de memória de R são os mesmos, independentemente do tipo, pelo menos de acordo com object.size. É útil passar para o código Fortran ou C, que pode exigir dados de um tipo específico.
James

2
Não, tente object.size(1:100)contra object.size(1:100+0)400 bytes + alguma sobrecarga vs. 800 bytes + alguma sobrecarga. Eu atualizei o exemplo acima.
Tommy

2
Vale a pena mencionar que o excesso de número inteiro é devido ao uso de inteiros assinados de 32 bits, portanto, restrito a cerca de +/- 2 * 10 ^ 9, mesmo em 64 bits R ...
Gavin Simpson

1
@Zach também é muito mais curto para tipo :-)
Gavin Simpson

1
@ Gavin Simpson, é claro. Eu estava realmente pensando na situação em que você criar um vetor inteiro, como c(1L, 2L, 3L, 4L,...100L)vs as.integer(c(1, 2, 3, 4,...100)).
Zach

54

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.


46

L especifica um tipo inteiro, em vez de um dobro da classe numérica padrão.

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

2

Para criar explicitamente um valor inteiro para uma constante, você pode chamar a função como.integer ou, mais simplesmente, usar o sufixo "L".

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.