20 Kreiranje funkcije

U R-u, funkcije se kreiraju pomoću ključne riječi function. Osnovna sintaksa za kreiranje funkcije je sljedeća:

  ime_funkcije <- function(argumenti) {
    # tijelo funkcije
    return(vrijednost)
  }

Gdje je ime_funkcije ime koje dajete funkciji, argumenti su ulazni parametri funkcije, a vrijednost je ono što funkcija vraća. return() neće uvijek biti potreban jer R automatski vraća posljednju liniju iz tijela funkcije, ali ako je output strukturiran, treba koristiti tu naredbu.

Evo jednostavnog primjera funkcije koja izračunava kvadrat broja:

kvadrat <- function(x) {
  rezultat <- x^2
  return(rezultat)
}

U ovom primjeru, funkcija kvadrat prima jedan argument x i vraća njegov kvadrat. Možemo isprobati kako radi, tako što ćemo pozvati definiranu funkciju kvadrat() i unijeti argument, npr. 5.

kvadrat(5)
## [1] 25

Evo još jednog primjera, funkcije koja računa prosječnu vrijednost niza brojeva:

prosjek <- function(brojevi) {
  suma <- sum(brojevi)
  broj_elemenata <- length(brojevi)
  return(suma / broj_elemenata)
}

Primjer upotrebe:

vektor <- rnorm(100, 35, 12)

prosjek(vektor)
## [1] 37

Kreiranje funkcija na ovaj način omogućuje vam da zapakirate ponavljajuće zadatke u ponovno upotrebljive blokove koda, što čini vaše programiranje u R-u efikasnijim i urednijim.

20.1 Funkcije s više argumenata

Funkcije mogu imati više argumenata koji omogućuju veću fleksibilnost i prilagodbu njihovog ponašanja.

zbroj_i_umnozak <- function(x, y) {
  zbroj <- x + y
  umnozak <- x * y
  return(list("Zbroj" = zbroj, "Umnozak" = umnozak))
}

Kreirana je funkcija zbroj_i_umnozak kao primjer funkcije koja prima dva argumenta (x i y), izračunava njihov zbroj i umnožak, te vraća obje vrijednosti kao listu. Evo detaljnog objašnjenja svakog dijela:

  • Funkcija počinje s ključnom riječi function nakon koje slijede argumenti funkcije unutar zagrada (x, y). Ovi argumenti su varijable koje funkcija očekuje kada se pozove.

  • Unutar tijela funkcije, prvo se izračunava zbroj dvaju brojeva pohranjenih u varijablama x i y, a zatim se izračunava njihov umnožak. Rezultati se pohranjuju u varijable zbroj i umnožak respektivno.

  • Na kraju, funkcija vraća listu koja sadrži oba rezultata: zbroj i umnožak. Lista je složeni objekt u R-u koji može sadržavati više elemenata različitih tipova. Ovdje, elementi liste imaju nazive “zbroj” i “umnozak” kojima se može pristupiti po imenu.

rezultat <- zbroj_i_umnozak(4, 5)
print(rezultat)
## $Zbroj
## [1] 9
## 
## $Umnozak
## [1] 20

Pozivanje funkcije odvija se na sljedeći način:

  • Funkcija se može pozvati s dva brojna argumenta, npr., zbroj_i_proizvod(4, 5). Ovaj poziv funkcije izračunat će zbroj (4 + 5 = 9) i proizvod (4 * 5 = 20) brojeva 4 i 5, te će vratiti listu s rezultatima. Ova funkcija vraća listu s dva elementa, zbrojem i proizvodom dva broja.
  • Korištenjem print(rezultat), gdje je rezultat varijabla u koju je pohranjen povrat funkcije, može se prikazati izlaz funkcije u konzoli.

20.2 Zadane vrijednosti argumenata

Funkcije mogu imati zadane vrijednosti za neke ili sve argumente, što korisnicima omogućava da ih pozovu bez potrebe za specificiranjem svih argumenata. To znači da kada pozivate funkciju, nije potrebno specificirati vrijednost za svaki argument ako je za njega već postavljena defaultna vrijednost. Ovo je korisno za postavljanje standardnih opcija ili vrijednosti koje su najčešće korištene, omogućujući korisniku da preskoči unos tih vrijednosti pri svakom pozivu funkcije.

pozdrav <- function(ime = "Svijete") {
  poruka <- paste("Pozdrav,", ime, "!")
  return(poruka)
}

pozdrav()
## [1] "Pozdrav, Svijete !"

Ako funkciju pozovemo bez argumenata, ispisuju se zadane vrijednosti. Ova funkcija ispisuje pozdravnu poruku, koristeći zadano ime “Svijete” ako korisnik ne specificira drugačije. No, ako upišemo argument, na primjer, “Ana,” onda će upravo taj argument zamijeniti zadani argument.

pozdrav("Ana")
## [1] "Pozdrav, Ana !"

Ako u argument upišemo vektor, funkcija će ponoviti radnju za svaki element vektora.

pozdrav(c("Ana", "Marija", "Lidija"))
## [1] "Pozdrav, Ana !"    "Pozdrav, Marija !" "Pozdrav, Lidija !"

20.3 Funkcije koje vraćaju više vrijednosti

Funkcije mogu vratiti više vrijednosti pomoću listi ili drugih složenih struktura podataka.

pokazatelji <- function(brojevi) {
  prosjek <- mean(brojevi)
  medijan <- median(brojevi)
  maksimum <- max(brojevi)
  minimum <- min(brojevi)
  return(list("Prosjek" = prosjek, "Medijan" = medijan, 
              "Maksimum" = maksimum, "Minimum" = minimum))
}

Pri kreiranju funkcije koja treba vratiti više vrijednosti, uobičajeni pristup je te vrijednosti pohraniti u listu. Lista može sadržavati elemente različitih tipova i dužina, što je čini idealnom za grupiranje više vrijednosti koje funkcija treba vratiti. U navedenom primjeru, funkcija pokazatelji prihvaća vektor brojevi kao ulazni argument i izračunava nekoliko pokazatelja deskriptivne statistike (prosjek, medijan, maksimum, minimum). Svaki izračunati pokazatelj (prosjek, medijan, maksimum, minimum) kreira zasebnu varijablu. Na kraju, ove se varijable spajaju u listu koristeći funkciju list(), gdje se svakoj vrijednosti dodjeljuje ime (npr., “Prosjek,” “Medijan,” itd.). Ova imena koriste se za identifikaciju pojedinih elemenata liste kada se lista vrati kao rezultat funkcije.

vektor <- c(1, 2, 3, 4, 5, 100)
rezultat <- pokazatelji(vektor)
print(rezultat)
## $Prosjek
## [1] 19
## 
## $Medijan
## [1] 3.5
## 
## $Maksimum
## [1] 100
## 
## $Minimum
## [1] 1

Ova funkcija izračunava i vraća prosjek, medijan, maksimum, i minimum niza brojeva. Ovi primjeri ilustriraju kako R omogućuje razvijanje funkcija koje su moćne, fleksibilne i prilagodljive potrebama korisnika.

Kada se funkcija pozove, može se pristupiti pojedinim elementima vraćene liste koristeći oznaku $ i imena elemenata.

rezultat$Prosjek
## [1] 19

Korištenjem lista na ovaj način, funkcije u R-u mogu efikasno upravljati i vraćati više izlaznih vrijednosti, čineći kod fleksibilnijim i čitljivijim.