Skalary
Podstawowymi typami danych są skalary umożliwiające reprezentację pojedynczych liczb, łańcuchów znaków lub wartości logicznych. Typ każdej zmiennej bądź wyrażenia możemy sprawdzić funkcją class(). Liczbę na której możemy wykonywać operacje arytmetyczne reprezentuje typ numeric.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# typ liczby całkowitej to numeric > class(2) [1] "numeric" # typ liczby zmiennoprzecinkowej to również numeric > class(2.3) [1] "numeric" # podstawowe operacje na liczbach > 1 + 2.3 [1] 3.3 > 1 - 2.3 [1] -1.3 > 3 * 3 [1] 9 > 4 / 3 [1] 1.333333 > 4 %/% 3 [1] 1 > 3 ^ 3 [1] 27 > sqrt(2) [1] 1.414214 |
Do przechowywania łańcuchów i pojedynczych znaków przeznaczony jest typ character:
1 2 3 4 5 6 7 8 9 10 11 12 |
# pojedynczy znak jest typu character > class("A") [1] "character" # łańcuch znaków jest również typu character > class("Ala ma kota") [1] "character" # dodawanie nie działa na typie character > "Ala" + "ma" Error in "Ala" + "ma" : non-numeric argument to binary operator # poprawna konkatenacja łańcuchów znaków > paste("Ala", "ma", "kota", sep=" ") [1] "Ala ma kota" |
Ostatnim z typów skalarnych jest typ logiczny logical. Służy on do przechowywania wartości prawdy (TRUE, T) oraz fałszu (FALSE, F):
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# porównywanie wartości logicznych > TRUE == TRUE [1] TRUE > TRUE == FALSE [1] FALSE > FALSE != FALSE [1] FALSE # konwersja, TRUE zamieniane na 1 > TRUE + 2 [1] 3 # konwersja, FALSE zamieniane na 0 > FALSE + 2 [1] 2 |
Znając typ logiczny możemy spojrzeć na operatory porównania dla liczb:
1 2 3 4 5 6 7 8 9 10 |
> 2.3 == 2.33 [1] FALSE > 4 > 3 [1] TRUE > 4 <= 3 [1] FALSE > 3 != 3.5 [1] TRUE > 3 != 3 [1] FALSE |
Wektor
Do przechowywania wielu skalarów tego samego typu służą wektory. Wektor to jednowymiarowa struktura zawierająca pewną liczbę elementów. Skalary są specjalną wersją wektora o rozmiarze 1. Do konstrukcji wektora wykorzystujemy funkcję c() przyjmującą elementy, które chcemy umieścić w wektorze. Próba stworzenia wektora o elementach różnych typów skutkuje konwersją do wspólnego typu:
1 2 3 4 5 6 7 8 9 10 11 12 |
# wektor trzech liczb > c(1, 2, 3) [1] 1 2 3 # wektor z dwóch liczb i wartości logicznej, konwersja do liczb > c(1, 2, TRUE) [1] 1 2 1 # wektor z dwóch liczb i łańcucha znaków, konwersja do łańcuchów znaków > c(1, 2, "3") [1] "1" "2" "3" # wektor z liczby, łańcucha znaków i wartości logicznej, konwersja do łańcuchów znaków > c(TRUE, 3, "3") [1] "TRUE" "3" "3" |
Sekwencje umożliwiają tworzenie wektorów liczbowych z podanymi zakresami wartości i krokiem o wartości 1. Użycie funkcji seq() umożliwia tworzenie sekwencji o arbitralnym kroku.
1 2 3 4 5 6 7 8 9 |
# sekwencja liczb od 5 do 10 > 5:10 [1] 5 6 7 8 9 10 # sekwencja liczb od 5 do -2 > 5:-2 [1] 5 4 3 2 1 0 -1 -2 # sekwencja o dowolnym kroku > seq(1, 10, 3) [1] 1 4 7 10 |
Często wykonywaną operacją na wektorach jest indeksowanie, czyli wybór konkretnych elementów z wektora:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
> a <- c(5, 4, 3, 2, 1) # pobranie pierwszego elementu > a[1] [1] 5 # pobranie wszystkich elementów oprócz pierwszego > a[-1] [1] 4 3 2 1 # pobranie elementu drugiego i czwartego > a[c(2, 4)] [1] 4 2 # pobranie wszystkich elementów oprócz pierwszego i piątego > a[c(-1, -5)] [1] 4 3 2 # pobranie elementów od trzeciego do piątego > a[3:5] [1] 3 2 1 # pobranie elementów od piątego do trzeciego (od końca) > a[5:3] [1] 1 2 3 |
Użycie ujemnych indeksów sprawia, że wartości pod podanymi indeksami nie są zwracane. Mieszanie ujemnych i dodatnich indeksów jest niedozwolone:
1 2 3 4 |
> a <- c(5, 4, 3, 2, 1) # próba wzięcia elementu piątego... i wszystkich elementów oprócz pierwszego > a[c(-1, 5)] Error in a[c(-1, 5)] : only 0's may be mixed with negative subscripts |
Istnieje szereg funkcji przeznaczonych specjalnie dla wektorów, np. funkcja length() zwracająca liczbę elementów w wektorze. Inne funkcje są z kolei zwektoryzowane. Oznacza to, że funkcje umiejętnie dobierają swoje działanie w zależności czy podano im zestaw argumentów, czy też pojedynczy wektor z argumentami.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
> a <- c(1, 2, 3, 4, 5) # sprawdzamy ilość elementów w wektorze > length(a) [1] 5 > sum(1:5) [1] 15 > min(3, 1, 4.4, -3) [1] -3 > min(c(3, 1, 4.4, -3)) [1] -3 # sprawdzamy typ wektora > class(a) [1] "numeric" |
Warto zauważyć, że wektory są homogeniczne w sensie typu. Dlatego też typem wektora jest typ elementów, które wektor ten przechowuje.