Często widoczne symbol 1L
(a 2L
, 3L
itp) zawarte w kodzie R. Jaka jest różnica między 1L
i 1
? 1==1L
ocenia do TRUE
. Dlaczego jest 1L
używany w kodzie R?
Często widoczne symbol 1L
(a 2L
, 3L
itp) zawarte w kodzie R. Jaka jest różnica między 1L
i 1
? 1==1L
ocenia do TRUE
. Dlaczego jest 1L
używany w kodzie R?
Odpowiedzi:
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.max
zawsze, gdy potrzebujesz maksymalnej wartości całkowitej (i zaneguj ją dla minimum).
object.size
. Przydatne jest przekazywanie do kodu Fortran lub C, który może wymagać danych określonego typu.
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.
c(1L, 2L, 3L, 4L,...100L)
vs as.integer(c(1, 2, 3, 4,...100))
.
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.
Aby jawnie utworzyć wartość całkowitą dla stałej, możesz wywołać funkcję as.integer lub po prostu użyć sufiksu "L".
1 == 1L
dajeTRUE
, aleidentical(1, 1L)
dajeFALSE
.