R.quit()
lub q().Enter.## [1] 6.283185
## [1] 0.5403023
=,
<-, <<-
<- ma najwyższy priorytet i jest standardowym
operatorem przypisania w R<<- może byc wykorzystany w ciele funkcji jeśli
chcemy wewnatrz funkcji nadac wartość zmiennej globalnej= służy do podawania parametrów funkcji## [1] 5
## [1] 2
## Error in `(b <- a) = 10`:
## ! could not find function "<-<-"
## [1] 5
## [1] 2
## [1] 10
## [1] 10
## [1] 2
## [1] 2.518098 1.914952 2.054152
source() ze sciezką do skryptu.########################## PLIK test_script.R ##############################
# Funkcja
# f <- function(x, y) {
# x <- 2*x
# y <<- 2*y
# }
# Główna część skryptu
# x <- 2
# y <- 2
#
# print(x)
# print(y)
# x
#
# f(2,2)
#
# cat("x =",x,"\n")
# cat("y =",y,"\n")
########################## Wykonanie skryptu ###############################
source("test_script.R")## Warning in file(filename, "r", encoding = encoding): cannot open file
## 'test_script.R': No such file or directory
## Error in `file()`:
## ! cannot open the connection
#.Source.Ctrl+Enter lub przycisk
Run.print() i cat() służą do
wypisywania wartości zmiennych na ekran.## y = 3
## [1] 4
numeric## [1] 10
## [1] "double"
L.## [1] "integer"
## [1] "double"
## [1] "integer"
a+bi.## [1] 2+3i
## [1] "complex"
## Warning in sqrt(-1): NaNs produced
## [1] NaN
## [1] 0+1i
## [1] 2300
NaN (“nie liczba”) oraz
nieskonczoności Inf, -Inf## [1] Inf
## [1] 0
## [1] NaN
character## [1] "Ala ma kota"
## [1] "Pakiet R"
## [1] "character"
paste()## [1] "I like trains"
character NIE jest
wektorem znaków.logicalTRUE lub T)
i fałsz (FALSE lub F).## [1] FALSE
## [1] TRUE
## [1] "logical"
## [1] 2
## [1] "double"
NA - brak wartości).c() tworzy wektor z pojedynczych elementów tego
samego typu.## [1] -1 2 5
seq()
lub zwyczajnym dwukropkiem.## [1] 1 2 3 4 5 6 7 8 9 10
## [1] -10 -8 -6 -4 -2 0 2 4 6 8 10
rep() służy do generowania wektorów z
powtórzeniami.## [1] TRUE TRUE TRUE TRUE TRUE
## [1] 1 2 3 1 2 3 1 2 3
## [1] 1 1 1 2 2 2 3 3 3
factor().levels() wypisuje poziomy## [1] podstawowe wyższe średnie średnie wyższe
## Levels: podstawowe średnie wyższe
## [1] "podstawowe" "średnie" "wyższe"
## [1] "integer"
## Warning in Ops.factor(wyksztalcenie, 1): '+' not meaningful for factors
## [1] NA NA NA NA NA
list().## $inty
## [1] 1 2 3 4 5 6 7 8 9 10
##
## $x
## [1] 2.71
##
## $tekst
## [1] "a" "b" "c"
##
## $log
## [1] TRUE TRUE TRUE TRUE TRUE
matrix().## [,1] [,2] [,3]
## [1,] 0 0 0
## [2,] 0 0 0
## [,1] [,2]
## [1,] 1 5
## [2,] 2 6
## [3,] 3 7
## [4,] 4 8
## [,1] [,2]
## [1,] "a" "c"
## [2,] "b" "d"
byrow=TRUE.## [,1] [,2]
## [1,] 1 2
## [2,] 3 4
## [3,] 5 6
## [4,] 7 8
array()## , , 1
##
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
##
## , , 2
##
## [,1] [,2] [,3]
## [1,] 10 13 16
## [2,] 11 14 17
## [3,] 12 15 18
##
## , , 3
##
## [,1] [,2] [,3]
## [1,] 19 22 25
## [2,] 20 23 26
## [3,] 21 24 27
data.frame()## liczby logiczne
## 1 5 TRUE
## 2 4 TRUE
## 3 3 TRUE
## 4 2 TRUE
## 5 1 TRUE
c(),
seq() lub dwukropka.## [1] 11 12 13 14 15
## [1] 12 13 14 15 16 17 18 19 20
## [1] 11 12 13 14 18
## [1] 11 13 14 16 17 18 19 20
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
## [1] 1 4 7
## [1] 1 2 3
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [,1] [,2]
## [1,] 1 4
## [2,] 2 5
## [3,] 3 6
## [,1] [,2]
## [1,] 1 7
## [2,] 3 9
## v1 v2 v3 v4
## 1 0 2 -1
## [1] "v1" "v2" "v3" "v4"
## v1
## 1
## v3
## 2
## col1 col2 col3
## row1 1 4 7
## row2 2 5 8
## row3 3 6 9
## NULL
## col1 col2 col3
## 2 5 8
## row1 row2 row3
## 7 8 9
## [1] 4
$ tzn. nazwa_listy$nazwa_zmiennej. Warto
pamiętać, że pojedynczy nawias kwadratowy daje jedynie przecięcie listy
(tzn. wynik jest listą) i aby otrzymać ten sam wynik, co w przypadku
operatora $, należy użyć nawiasu podwójnego [[…]].## [1] 1 2 3 4 5 6 7 8 9 10
## $inty
## [1] 1 2 3 4 5 6 7 8 9 10
## [1] 1 2 3 4 5 6 7 8 9 10
## liczby logiczne
## 1 5 TRUE
## 2 4 TRUE
## 3 3 TRUE
## 4 2 TRUE
## 5 1 TRUE
## liczby logiczne
## 1 5 TRUE
## 2 4 TRUE
## 3 3 TRUE
## [1] TRUE TRUE TRUE TRUE TRUE
## [1] 5 4 3 2 1
## [1] 16 17
## [1] "b" "c"
## [1] 5 4 3
## [1] 5 4 3
## [1] 5 4 3
Zdefiniujmy następujące wektory w, u i
macierze A, B:
## [1] 1 2
## [1] 3 4
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
## [,1] [,2]
## [1,] 4 2
## [2,] 3 1
W pakiecie R, podobnie zresztą jak w innych językach skryptowych (np. Matlab), wiekszość funkcji jest przeciążona że wzgledu na operacje wykonywane na wektorach i macierzach. Innymi słowy, operacje takie są wykonywane po kolejnych elementach wektora (lub macierzy) i zwracane jako podobny obiekt.
Możemy wykonywać następujące operacje na wektorach
w + v,w + 5,2 * w,exp(w),w %*% v.## [1] 4 6
## [1] 6 7
## [1] 2 4
## [1] 0.8414710 0.9092974
## [,1]
## [1,] 11
Podobna sytuacja dotyczy macierzy. Dodatkowo mamy do dyspozycji inne, bardzo przydatne funkcje obsługi macierzy:
A + B,1 + A,2 * A,t(A),det(A),A %*% B,eigen(A).## [,1] [,2]
## [1,] 5 5
## [2,] 5 5
## [,1] [,2]
## [1,] 2 4
## [2,] 3 5
## [,1] [,2]
## [1,] 2 6
## [2,] 4 8
## [,1] [,2]
## [1,] 1 2
## [2,] 3 4
## [1] -2
## [,1] [,2]
## [1,] 13 5
## [2,] 20 8
## eigen() decomposition
## $values
## [1] 5.3722813 -0.3722813
##
## $vectors
## [,1] [,2]
## [1,] -0.5657675 -0.9093767
## [2,] -0.8245648 0.4159736
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 25
Warunek musi mieć długość równą 1, inaczej instrukcja warunkowa nie zostanie wykonana.
## Error in `if (x%%3) ...`:
## ! the condition has length > 1
W przypadku, gdy mamy możliwość pracy na wektorze wartości, wygodnie jest korzystać z funkcji ifelse(), która sprawdza warunek dla każdego elementu wektora i zwraca również wektor.
## [1] "Nie dzieli się przez 3" "Nie dzieli się przez 3" "Dzieli się przez 3"
## [4] "Nie dzieli się przez 3" "Nie dzieli się przez 3" "Dzieli się przez 3"
## [7] "Nie dzieli się przez 3" "Nie dzieli się przez 3" "Dzieli się przez 3"
## [10] "Nie dzieli się przez 3"
Następujące funkcje są bardzo przydatne podczas przetwarzania danych w formacie wektorowym:
## [1] 5
## [1] -0.2
## [1] 3.114482
## [1] -5 3 0 -1 2
## [1] -1
## [1] 2 1 1 4 -1
## [1] 0
## [1] 2 -2 0 0 0
## [1] -5
## [1] 5
## [1] 3
## [1] 4
decreasing=TRUE) malejąco## [1] -5 -1 0 2 3
## [1] 3 2 0 -1 -5
index=TRUE powoduje stworzenie listy,
której pierwszym elementem x jest posortowany wektor,
drugim zaś ix indeksy oryginalnych danych w posortowanym
wektorze## $x
## [1] -5 -1 0 2 3
##
## $ix
## [1] 5 2 3 1 4
NA (brak wartości) - wtedy funkcje nie zwrócą oczekiwanego
wyniku, chyba że zostanie zastosowana opcja
na.rm=TRUE.## [1] NA
## [1] NA
## [1] 15
## [1] 3.75
which podaje indeksy elementów spełniających
określony warunek.## [1] 4 5
## [1] 3
which(y == NA) wyświetli komunikat
błędu. Aby znaleźć indeksy elementów NA lub
NaN i +/-Inf należy skorzystac z funkcji
is.na, is.nan, is.finite oraz
is.infinite wewnątrz funkcji which.## [1] NaN NA Inf -Inf 10 15
## [1] TRUE TRUE FALSE FALSE FALSE FALSE
## [1] TRUE FALSE FALSE FALSE FALSE FALSE
## [1] FALSE FALSE TRUE TRUE FALSE FALSE
## [1] 1 2
## [1] 1
## [1] 3 4
Część powyższych funkcji można zastosować także do macierzy, przy
czym w przypadku which.min() oraz which.max()
konieczne jest użycie dodatkowo funkcji arrayInd() do
określenia indeksów macierzy - w przeciwnym wypadku otrzymamy tylko
indeks “wektorowy”.
## [,1] [,2] [,3] [,4]
## [1,] 1 5 9 13
## [2,] 2 6 10 14
## [3,] 3 7 11 15
## [4,] 4 8 12 16
## [1] 16
## [1] 136
## [1] 8.5
## [1] 4.760952
## [1] 1
## [1] 16
## [1] 1
## [1] 16
## [,1] [,2]
## [1,] 1 1
## [,1] [,2]
## [1,] 4 4
Jak w każdym języku programowania, bardzo ważnym elementem języka
R są funkcje własne. Schemat tworzenia funkcji jest
następujący
Warto zaznaczyć, że funkcja może przyjmowac oraz zwracać nie tylko skalary, ale również wektory, macierze czy listy. Przykładem może byc funkcja realizująca “tabliczkę mnożenia” dla dowolnych dwoch wektorów.
tabliczka_mnożenia <- function(zakres1, zakres2) {
return(zakres1 %o% zakres2)
}
tabliczka_mnożenia(1:10,1:10)## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,] 1 2 3 4 5 6 7 8 9 10
## [2,] 2 4 6 8 10 12 14 16 18 20
## [3,] 3 6 9 12 15 18 21 24 27 30
## [4,] 4 8 12 16 20 24 28 32 36 40
## [5,] 5 10 15 20 25 30 35 40 45 50
## [6,] 6 12 18 24 30 36 42 48 54 60
## [7,] 7 14 21 28 35 42 49 56 63 70
## [8,] 8 16 24 32 40 48 56 64 72 80
## [9,] 9 18 27 36 45 54 63 72 81 90
## [10,] 10 20 30 40 50 60 70 80 90 100
Instrukcja return() nie jest obligatoryjna - za wartość
funkcji przyjmowana jest wartość wyznaczona w ostatniej jej linii.
## [1] 7
Wszystkie wartości przekazane do funkcji są widoczne i zmieniane
lokalnie. W przypadku potrzeby zmiany wartości zmiennej tak, aby była
widoczna globalnie należy użyć operatora przypisania
<<-
## [1] 2
## [1] 4
Bardzo popularną formą pomocy przy używaniu języka R są tak zwane cheat sheets. Można je znaleźć na stronie internetowej https://rstudio.github.io/cheatsheets/. Innym sposobem nd dotarcie do nich jest otwarcie menu Help w RStudio i wybraniu pozycji Cheat Sheets z rozwijanej listy.