5 Osnovni operatori i funkcije
5.1 Operatori u R-u
Ovo poglavlje predstavlja različite vrste operatora koji se koriste u R programskom jeziku, uključujući aritmetičke, logičke, usporedne, operatore za dodjelu, kontrolu tijeka, specifične operatore te operatore za funkcije. Kroz pregled svakog tipa operatora, prikazat će se prikladne oznake za manipulaciju podacima, izvođenje matematičkih operacija i kontrolu tijeka programa.
Operatori za dodjelu:
‘<-’ ili ‘=’: standardni operatori za dodjelu
‘<<-’: globalna dodjela
‘->’: dodjela s desna na lijevo
Primjeri:
> a <- 40
> b <- 10
> print(a)
## [1] 40
> print(b)
## [1] 10
> a = 50
> b = 20
> print(a)
## [1] 50
> print(b)
## [1] 20
> moja_funkcija <- function() {
+ a <<- 60
+ b <<- 30
+ }
>
> moja_funkcija()
> print(a)
## [1] 60
> print(b)
## [1] 30
> 70 -> a
> 80 -> b
> print(a)
## [1] 70
> print(b)
## [1] 80
> a <- 40
> b <- 10
> print(a)
## [1] 40
> print(b)
## [1] 10
Aritmetički operatori:
‘+’ (plus): zbrajanje
‘-’ (minus): oduzimanje
’*’ (puta): množenje
‘/’ (podijeljeno s): dijeljenje
‘^’ ili ’**’: potenciranje
‘%%’: moduo (ostatak pri dijeljenju)
‘%/%’: cjelobrojno dijeljenje
Primjeri:
> 40 + 10
## [1] 50
> 40 - 10
## [1] 30
> 40 * 10
## [1] 400
> 40 / 10
## [1] 4
> 40 ^ 10
## [1] 1.048576e+16
> 40 %% 10
## [1] 0
> 40 %/% 10
## [1] 4
Logički operatori:
‘&’ ili ‘&&’: logički AND
‘|’ ili ‘||’: logički OR
‘!’: logički NOT
‘!=’: logički NOT EQUAL to
Ovi operatori se koriste za usporedbu i testiranje uvjeta
Primjeri:
> result_and <- (a > 30) & (b < 20)
> print(result_and)
## [1] TRUE
> result_and_short <- (a > 30) && (b < 5)
> print(result_and_short)
## [1] FALSE
> result_or <- (a > 50) | (b < 20)
> print(result_or)
## [1] TRUE
> result_or_short <- (a > 50) || (b < 5)
> print(result_or_short)
## [1] FALSE
> result_not <- !(a < 50)
> print(result_not)
## [1] FALSE
> result_not_equal <- (a != b)
> print(result_not_equal)
## [1] TRUE
Operatori za usporedbu:
‘<:’ manje od
‘<=:’ manje ili jednako
‘>:’ veće od
‘>=:’ veće ili jednako
‘==:’ jednakost
‘!=:’ nejednakost
Primjeri:
> result_less_than <- a < b
> print(result_less_than)
## [1] FALSE
> result_less_equal <- a <= b
> print(result_less_equal)
## [1] FALSE
> result_greater_than <- a > b
> print(result_greater_than)
## [1] TRUE
> result_greater_equal <- a >= b
> print(result_greater_equal)
## [1] TRUE
> result_equal <- a == b
> print(result_equal)
## [1] FALSE
> result_not_equal <- a != b
> print(result_not_equal)
## [1] TRUE
Operatori za kontrolu tijeka:
‘%in%’: operator pripadnosti, koristi se za provjeru nalazi li se element u skupu
Primjer:
> moj_set <- c(10, 20, 30, 40, 50)
> result_a_in_set <- a %in% moj_set
> print(result_a_in_set)
## [1] TRUE
> result_b_in_set <- b %in% moj_set
> print(result_b_in_set)
## [1] TRUE
> result_60_in_set <- 60 %in% moj_set
> print(result_60_in_set)
## [1] FALSE
Specifični operatori:
’%*%’: matrično množenje
‘%/%’: cjelobrojno dijeljenje
‘%o%’: vanjski produkt
‘%x%’: Kroneckerov produkt
‘:’: operator za stvaranje sekvenci
Primjeri:
> matrix1 <- matrix(c(a, b, b, a), nrow = 2)
> matrix2 <- matrix(c(b, a, a, b), nrow = 2)
> result_matrix_mult <- matrix1 %*% matrix2
> print(result_matrix_mult)
## [,1] [,2]
## [1,] 800 1700
## [2,] 1700 800
> result_int_div <- a %/% b
> print(result_int_div)
## [1] 4
> result_outer_product <- a %o% c(b, a)
> print(result_outer_product)
## [,1] [,2]
## [1,] 400 1600
> result_kronecker_product <- a %x% matrix(c(b, a), nrow = 1)
> print(result_kronecker_product)
## [,1] [,2]
## [1,] 400 1600
> result_sequence <- b:a
> print(result_sequence)
## [1] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
## [26] 35 36 37 38 39 40
Operatori za funkcije:
‘%>%’: operator pipe, popularan u dplyr i tidyverse paketima, koristi se za lančanje naredbi
‘|>’: alternativni zapis operatora pipe, koristi se u kontekstu „onda/ then”.
Primjeri:
> library(dplyr)
>
> result_pipe <- a %>%
+ `*`(2) %>% # množenje s 2
+ `+`(b) %>% # pribrajanje b
+ `^`(2) # kvadriranje rezultata
> print(result_pipe) # Rezultat operacije ((a * 2) + b)^2
## [1] 8100
> divide_by_2 <- function(x) x / 2
> add_b <- function(x) x + b
>
> result_pipe_then <- a |>
+ divide_by_2() |> # Poziv funkcije dijeljenja s 2
+ add_b() # Poziv funkcije pribrajanja b
>
> print(result_pipe_then) # Rezultat (a / 2) + b
## [1] 30
Ovi operatori su ključni u svakodnevnom radu s R-om, omogućujući manipulaciju podacima, izvođenje matematičkih operacija i kontrolu tijeka programa. Razumijevanje i pravilna upotreba ovih operatora su osnova za efikasno programiranje u R-u.
5.2 Osnovne funkcije
Ovo poglavlje predstavlja osnovne funkcije u R programskom jeziku. Fokus je na četiri osnovne funkcije, a svaka od njih je detaljno objašnjena s opisom parametara i praktičnim primjerima primjene.
R ima veliku bazu funkcija. Pri pozivanju funkcije, koristi se naziv funkcije i potom se upisuju zagrade. U zagradi će se naći argumenti ili parametri funkcije. Svaka funkcija ima drugačije definirane argumente ili parametre. Pri susretu s novom funkcijom, najbolje je koristiti Help u donjem desnom prozoru u RStudiju, koji nudi pretraživanje dokumentacije i opis funkcija.
Na primjer, za nekoliko češće korištenih funkcija, ovdje je navedeno prvih nekoliko funkcija koje će se koristiti u nastavku:
c {base}
c()
ovo je generička funkcija za kombiniranje elemenata
zadano (engl. default):
c(…, recursive = FALSE, use.names = TRUE)
gdje
- ‘…’ označava elemente koji će biti povezani;
- recursive je logički parametar kojem se mogu pridružiti vrijednosti TRUE ili FALSE, pri čemu FALSE postavka ne mijenja zapis zadanih elemenata, a TRUE rezultira rekurzivnim preuzimanjem elemenata kroz popis i kombiniranjem elemenata u vektor
- use.names je logički parametar kojem se mogu pridružiti vrijednosti TRUE ili FALSE, pri čemu TRUE označava da nazivi trebaju biti sačuvani
primjeri (navedeni i na stranici Help pri pretrazi za c() ):
x <- 1:4
c(list(A = c(B = 1)), recursive = TRUE)
c(list(A = c(B = 1, C = 2), B = c(E = 7)), recursive = TRUE)
> x <- 1:4
> c(list(A = c(B = 1)), recursive = TRUE)
> c(list(A = c(B = 1, C = 2), B = c(E = 7)), recursive = TRUE)
Na primjer: žele se analizirati godišnje temperature za nekoliko gradova i trebate kreirati vektor s tim temperaturama.
Kako koristiti: koristi se funkcija c()
za stvaranje vektora koji sadrži prosječne godišnje temperature za svaki grad.
> temperature <- c(16, 18, 20, 15, 17)
Dakle, elementi 16, 18, 20, 15, 17 su kombinirani i pridruženi vektoru, odnosno pohranjeni pod nazvom temperature. U vektoru temperature, 16 se nalazi na prvom mjestu, 18 na drugom, 20 na trećem, itd. Njihov je poredak određen zapisanim redosljedom.
print {base}
print()
ovo je generička funkcija za ispis argumenata
automatski prepoznaje tip argumenta koji se ispisuje te će sukladno tome nuditi različite parametre koji se mogu podesiti
za ispis faktora:
print(x, quote = FALSE, max.levels = NULL, width = getOption(“width”), …)
za ispis tablice:
print(x, digits = getOption(“digits”), quote = FALSE,
na.print = ““, zero.print =”0”,
right = is.numeric(x) || is.complex(x),
justify = “none,” …)
za ispis funkcije:
print(x, useSource = TRUE, …)
gdje
- x označava objekt koji se ispisuje
- ‘…’ označava dodatne argumente koji se pridružuju funkciji
- quote je logički parametar koji označava trebaju li se znakovi ispisivati koristeći navodne znakove
- max.levels - cjelobrojna vrijednost, označava koliko razina faktora treba ispisati
- digits - označava najmanji broj značajnih znamenki
- na.print - treba li ispisati NA vrijednosti
- zero.print - koliko nula treba ispisati
- right - poravnanje ispisa
> print("Dobar dan!")
> print(x)
Na primjer: nakon analize podataka, želite ispisati rezultate na ekran kako biste ih mogli pregledati ili podijeliti s kolegama.
Kako koristiti: upotrijebite print()
za ispisivanje rezultata, na primjer, ispisa ranije kreiranih prosječnih temperatura.
> print(temperature)
## [1] 16 18 20 15 17
seq {base}
seq()
generiranje pravilnih sekvenci brojeva
seq.int(from, to, by, length.out, along.with, …)
seq(from = 1, to = 1, by = ((to - from)/(length.out - 1)),
length.out = NULL, along.with = NULL, …)
from - označava početnu vrijednost u nizu
to - označava posljednju vrijednost u nizu
by - označava povećanje u nizu brojeva
na primjer, seq(1,15,3) rezultirat će nizom brojeva: 1, 4, 7, 10, 13
> seq(1, 15, 3)
Na primjer: planirate niz eksperimenata koji se trebaju odvijati u redovitim intervalima tijekom godine, i trebate generirati sekvencu datuma za svaki eksperiment.
Kako koristiti: upotrijebite seq()
za stvaranje niza ili sekvence brojeva koji predstavljaju, na primjer, svaki deseti dan u godini.
> dani <- seq(from = 1, to = 365, by = 10)
> dani
## [1] 1 11 21 31 41 51 61 71 81 91 101 111 121 131 141 151 161 171 181
## [20] 191 201 211 221 231 241 251 261 271 281 291 301 311 321 331 341 351 361
rep {base}
rep()
replikacija/ ponavljanje vrijednosti određeni broj puta
rep(x, …)
rep.int(x, times)
rep_len(x, length.out)
gdje
- x je vektor bilo koje vrste ili faktor
- times je cjelobrojna vrijednost koja naznačava koliko se puta x ponavlja
- length.out - je nenegativna cjelobrojna vrijednost koja označava željenu duljinu vektora
- each - nenegativna cjelobrojna vrijednost koja označava koliko se puta svaki element naveden u x-u ponavlja
> rep(c(0, 1), 8)
## [1] 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
Na primjer: pretpostavimo da razvijate algoritam za obradu nizova brojeva i želite testirati kako se vaš algoritam ponaša s ponavljajućim uzorcima. Potreban vam je jednostavan niz koji se sastoji od uzorka 0, 1, 1 koji se ponavlja nekoliko puta.
Kako koristiti: možete koristiti rep()
za kreiranje željenog niza koji ponavlja uzorak c(0, 1, 1)
pet puta. Tako dobiveni vektor sadrži ukupno 15 elemenata jer je početni uzorak c(0, 1, 1)
koji se sastoji od tri elementa ponovljen pet puta.
> sequence <- rep(c(0, 1, 1), 5)
> sequence
## [1] 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1