Jaka jest różnica między „1L” a „1”?


152

Często widoczne symbol 1L(a 2L, 3Litp) zawarte w kodzie R. Jaka jest różnica między 1Li 1? 1==1Locenia do TRUE. Dlaczego jest 1Lużywany w kodzie R?


18
Uwaga: 1 == 1Ldaje TRUE, ale identical(1, 1L)daje FALSE.
CJB

2
Zobacz także Wyjaśnienie L w R
Henrik

Odpowiedzi:


129

Tak więc @James i @Brian wyjaśnili, co oznacza 3L. Ale dlaczego miałbyś go używać?

W większości przypadków nie ma to znaczenia - ale czasami można go użyć, aby kod działał szybciej i zużywał mniej pamięci . Wektor podwójny („numeryczny”) zajmuje 8 bajtów na element. Wektor liczb całkowitych wykorzystuje tylko 4 bajty na element. W przypadku dużych wektorów oznacza to mniej zmarnowanej pamięci i mniej czasu na przejście procesora (więc jest zwykle szybszy).

Dotyczy to głównie pracy z indeksami. Oto przykład, w którym dodanie 1 do wektora liczb całkowitych zamienia go w wektor podwójny:

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) 

... ale pamiętaj również, że nadmierna praca z liczbami całkowitymi może być niebezpieczna:

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

... i jak zauważył @Gavin, zakres dla liczb całkowitych wynosi mniej więcej od -2e9 do 2e9.

Zastrzeżenie jest jednak takie, że dotyczy to aktualnej wersji R (2.13). R może to zmienić w pewnym momencie (64-bitowe liczby całkowite byłyby słodkie, co mogłoby umożliwić wektory o długości> 2e9). Aby być bezpiecznym, powinieneś używać .Machine$integer.maxzawsze, gdy potrzebujesz maksymalnej wartości całkowitej (i zaneguj ją dla minimum).


1
Myślę, że wymagania dotyczące pamięci przez R są takie same niezależnie od typu, przynajmniej według object.size. Przydatne jest przekazywanie do kodu Fortran lub C, który może wymagać danych określonego typu.
James,

2
Nie, spróbuj object.size(1:100)vs. object.size(1:100+0)to 400 bajtów + trochę narzutu vs 800 bajtów + trochę narzutu. Zaktualizowałem powyższy przykład.
Tommy

2
Warto wspomnieć, że przepełnienie liczb całkowitych wynika z użycia 32-bitowych liczb całkowitych ze znakiem, stąd jest ograniczone do około +/- 2 * 10 ^ 9, nawet na 64-bitowym R ...
Gavin Simpson

1
@Zach jest też o wiele krótszy do wpisania :-)
Gavin Simpson

1
@Gavin Simpson oczywiście. Byłem naprawdę myśleć o sytuacji, w której tworzysz cały wektor, jak c(1L, 2L, 3L, 4L,...100L)vs as.integer(c(1, 2, 3, 4,...100)).
Zach,

54

Z Stałe sekcji w definicji R Język :

Możemy użyć sufiksu „L”, aby zakwalifikować dowolną liczbę z zamiarem uczynienia z niej jawnej liczby całkowitej. Więc „0x10L” tworzy liczbę całkowitą 16 z reprezentacji szesnastkowej. Stała 1e3L daje 1000 jako liczbę całkowitą, a nie wartość liczbową i jest równoważna 1000L. (Zwróć uwagę, że „L” jest traktowane jako kwalifikujące termin 1e3, a nie 3). Jeśli zakwalifikujemy wartość za pomocą „L”, która nie jest liczbą całkowitą, np. 1e-3L, otrzymamy ostrzeżenie, a wartość liczbowa to Utworzony. Ostrzeżenie jest również tworzone, jeśli w liczbie występuje niepotrzebna kropka dziesiętna, np. 1.L.


46

L określa typ liczby całkowitej, a nie dwukrotność standardowej klasy liczbowej.

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

2

Aby jawnie utworzyć wartość całkowitą dla stałej, możesz wywołać funkcję as.integer lub po prostu użyć sufiksu "L".

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.