10 Kreiranje funkcija

Kreiranje vlastitih funkcija u R-u omogućava nam da modulariziramo kod i grupiramo ponavljajuće zadatke u ponovno upotrebljive blokove. Na taj način smanjujemo potrebu za ponavljanjem koda, poboljšavamo čitljivost te omogućavamo brže i jednostavnije promjene u budućnosti. Ovo poglavlje pokriva osnovne primjere, kao što su jednostavne funkcije s jednim argumentom, funkcije s više argumenata i funkcije koje vraćaju više izlaznih vrijednosti koristeći složene strukture podataka, poput lista. Također, upoznat ćemo se s funkcijama koje omogućuju postavljanje zadane vrijednosti za argumente, što korisnicima daje dodatnu fleksibilnost pri pozivanju funkcije bez potrebe za unosom svakog argumenta.

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

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.

10.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. Postupak kreiranja:

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

  • Potom 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_umnozak(4, 5). Ovaj poziv funkcije izračunat će zbroj (4 + 5 = 9) i umnožak (4 * 5 = 20) brojeva 4 i 5, te će vratiti listu s rezultatima.
  • Korištenjem print(rezultat), gdje je rezultat varijabla u koju je pohranjen povrat funkcije, može se prikazati izlaz funkcije u konzoli.

10.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 !"

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

Pitanja za ponavljanje

  1. Kako se definira funkcija u R-u, i koja je svrha ključne riječi function pri kreiranju funkcije?

  2. Koja je razlika između korištenja return() unutar tijela funkcije i izostavljanja te naredbe u R-u?

  3. Napišite jednostavnu funkciju koja izračunava kub broja. Kako biste pozvali tu funkciju za broj 3?

  4. Kako možete kreirati funkciju koja prima dva argumenta i vraća njihov zbroj i umnožak kao listu?

  5. Što su zadane vrijednosti argumenata u funkciji i kako one poboljšavaju fleksibilnost poziva funkcije? Navedite primjer.

  6. Koje su prednosti korištenja lista kao povrata iz funkcije kada je potrebno vratiti više vrijednosti?

  7. Kako možete definirati funkciju koja ima zadanu vrijednost za argument, ali omogućava korisniku da tu vrijednost promijeni pri pozivu funkcije?

  8. Kreirajte funkciju koja prima niz brojeva i vraća listu koja sadrži srednju vrijednost, standardnu devijaciju i raspon.

  9. Što će se dogoditi ako pozovete funkciju pozdrav s vektorom imena c(“Ana,” “Ivan”)? Objasnite kako R rukuje vektorima unutar funkcija.

  10. Kako biste u povratnoj vrijednosti iz funkcije pristupili specifičnom elementu liste, primjerice medijanu iz prethodne funkcije koja vraća deskriptivne statističke pokazatelje?