Chciałbym rozpocząć od stwierdzenia, że jestem absolutnie początkującym programistą, więc proszę wybacz, jak podstawowe jest to pytanie.
Próbuję lepiej zrozumieć „atomowe” klasy w R i być może dotyczy to ogólnie zajęć z programowania. Rozumiem różnicę między klasami znakowymi, logicznymi i złożonymi klasami danych, ale staram się znaleźć podstawową różnicę między klasą liczbową a klasą liczb całkowitych.
Powiedzmy, że mam prosty wektor x <- c(4, 5, 6, 6)
liczb całkowitych, sensowne byłoby, gdyby była to klasa liczb całkowitych. Ale kiedy class(x)
dostanę [1] "numeric"
. Następnie, jeśli przekonwertuję ten wektor na klasę liczb całkowitychx <- as.integer(x)
. Zwraca tę samą dokładną listę liczb, ale klasa jest inna.
Moje pytanie brzmi: dlaczego tak jest i dlaczego domyślną klasą zbioru liczb całkowitych jest klasa numeryczna oraz jakie są zalety i wady posiadania liczby całkowitej ustawionej jako numeryczna zamiast całkowitej.
as.integer(c(4.1, 5.2, 6.3, 6.4))
pomaga zrozumieć różnicę? Musisz zrozumieć, że wewnętrzna reprezentacja i to, co jest drukowane, wcale nie są takie same. W każdym razie poczytaj o typach danych w językach komputerowych.x <- 1; is.integer(x); is.numeric(x)
więc,x <- 1L; is.integer(x); is.numeric(x)
a możesz dostrzec niewielką różnicę. Klasy całkowite są używane częściej do przekazywania zmiennych z konstrukcji C, a także w strukturach R. Chociaż jest o wiele więcej w tym.Odpowiedzi:
Istnieje wiele klas, które są zgrupowane razem jako klasy „numeryczne”, z których 2 najczęściej spotykane to podwójne (dla liczb zmiennoprzecinkowych o podwójnej precyzji) i liczby całkowite. R automatycznie konwertuje między klasami numerycznymi w razie potrzeby, więc w większości przypadków dla zwykłego użytkownika nie ma znaczenia, czy liczba 3 jest obecnie przechowywana jako liczba całkowita czy podwójna. Większość matematyki jest wykonywana z podwójną precyzją, więc często jest to domyślna pamięć.
Czasami możesz chcieć specjalnie zapisać wektor jako liczby całkowite, jeśli wiesz, że nigdy nie zostaną one zamienione na liczby podwójne (używane jako wartości identyfikacyjne lub indeksowanie), ponieważ liczby całkowite wymagają mniej miejsca w pamięci. Ale jeśli mają zostać użyte w jakiejkolwiek matematyce, która zamieni je na podwojenie, to prawdopodobnie najszybciej będzie po prostu zapisać je jako podwójne.
źródło
Po pierwsze, używanie R z powodzeniem przez lata jest całkowicie wykonalne i nie trzeba znać odpowiedzi na to pytanie. R obsługuje w tle różnice między (zwykłymi) liczbami a liczbami całkowitymi.
> is.numeric(1) [1] TRUE > is.integer(1) [1] FALSE > is.numeric(1L) [1] TRUE > is.integer(1L) [1] TRUE
(Umieszczenie dużej litery „L” po liczbie całkowitej wymusza zapisanie jej jako liczby całkowitej).
Jak widać, „liczba całkowita” jest podzbiorem „liczbowych”.
> .Machine$integer.max [1] 2147483647 > .Machine$double.xmax [1] 1.797693e+308
Liczby całkowite dochodzą do nieco ponad 2 miliardy, podczas gdy inne liczby mogą być znacznie większe. Mogą być większe, ponieważ są przechowywane jako liczby zmiennoprzecinkowe o podwójnej precyzji. Oznacza to, że liczba jest przechowywana w dwóch częściach: wykładniku (jak 308 powyżej, z wyjątkiem podstawy 2 zamiast podstawy 10) i „sztyftu” (jak powyżej 1.797693).
Zauważ, że „is.integer” nie jest testem tego, czy masz liczbę całkowitą, ale testem sposobu przechowywania danych.
Należy zwrócić uwagę na to, że operator dwukropka,,
:
zwróci liczby całkowite, jeśli punkt początkowy i końcowy są liczbami całkowitymi. Na przykład1:5
tworzyinteger
wektor liczb od 1 do 5. Nie musisz dodawać literyL
.> class(1:5) [1] "integer"
Źródła: https://www.quora.com/What-is-the-difference-between-numeric-and-integer-in-R
źródło
Cytując stronę pomocy (spróbuj
?integer
), moja pogrubiona część:Jak mówi strona pomocy, R.
integer
są 32-bitowymi liczbami ze znakiem, więc mogą zawierać od -2147483648 do +2147483647 i zajmować 4 bajty.R
numeric
jest identyczny z 64-bitowym,double
zgodnym ze standardem IEEE 754. R nie ma typu danych o pojedynczej precyzji. (źródło: strony pomocynumeric
idouble
). Double może przechowywać wszystkie liczby całkowite od -2 ^ 53 do 2 ^ 53 bez utraty precyzji.Możemy zobaczyć rozmiary typów danych, w tym narzut wektora ( źródło ):
> object.size(1:1000) 4040 bytes > object.size(as.numeric(1:1000)) 8040 bytes
źródło
W moim rozumieniu - nie deklarujemy zmiennej o typie danych, więc domyślnie R ustawił dowolną liczbę bez L jako liczbę. Jeśli napisałeś:
> x <- c(4L, 5L, 6L, 6L) > class(x) >"integer" #it would be correct
Przykład liczby całkowitej:
> x<- 2L > print(x)
Przykład liczbowy (coś w rodzaju double / float z innych języków programowania)
> x<-3.4 > print(x)
źródło
1:5
utworzy liczby całkowite.