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] 1e+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 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.

Pitanja za ponavljanje

  1. Ako je a <- 50 i b <- 20, što će biti rezultat izraza a %% b?

  2. Ako definirate c <- 3 i koristite naredbu c <- c + 2, koja će biti nova vrijednost varijable c?

  3. Ako imate vektor x <- c(5, 10, 15) i naredbu x %in% c(10, 15, 20), što će biti rezultat?

  4. Što će naredba 40 %/% 6 vratiti, i koja je razlika u odnosu na 40 / 6?

  5. Ako napišete a <- 5; b <- 3; a > b & b < 5, hoće li rezultat biti TRUE ili FALSE?

  6. Ako koristite operator %>% u R-u, objasnite što radi sljedeći izraz: c(1, 2, 3) %>% sum() %>% sqrt().

  7. Što će izraz 5 ^ 2 vratiti? Koji operator u R-u koristite za potenciranje?

  8. Ako koristite operator ! na logičkoj vrijednosti TRUE, koji će biti rezultat?

  9. Ako imate naredbu seq(1, 10, by = 2), koju će sekvencu brojeva vratiti?

  10. Ako koristite a <- 20; b <- 4, što će naredba a / b == 5 vratiti kao rezultat?

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 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

Pitanja za ponavljanje

  1. Koja je svrha funkcije c() u R-u, i kako se koristi za stvaranje vektora?

  2. Što radi argument recursive u funkciji c()?

  3. Kada biste koristili funkciju print() i koja je njena osnovna svrha?

  4. Koji parametar u funkciji print() omogućava prikazivanje vrijednosti bez navodnika?

  5. Kako funkcionira funkcija seq() i čemu služe argumenti from, to, i by?

  6. Koji je rezultat naredbe seq(5, 25, by = 5)?

  7. Kada biste koristili funkciju rep() i što čini argument times?

  8. Ako želite generirati sekvencu koja ponavlja niz c(“A,” “B”) deset puta, kako biste to postigli koristeći rep()?

  9. Koji je rezultat naredbe rep(c(1, 5, 10), 3)?

  10. Što biste trebali učiniti ako želite saznati više o parametrima funkcije u R-u, kao što su print() ili seq()?


Ovih nekoliko primjera upotrijebit će se već u sljedećem poglavlju. Čitatelji se potiču na samostalno korištenje Help stranica dostupnih putem RStudija.