######################################
### PETI CAS - PROGRAMIRANJE U R-U ###
######################################

# Definisanje funkcije IME_FJE<-function(arg1,arg2,arg3,...) {TELO FUNKCIJE}
# Poziv f-je IME_FJE(arg1,arg2,...) sa konkretnim argumentima
# Ako zelimo da vidimo kod postojecih f-ja, kucamo samo ime bez argumenata
factorial
# Primer f-je koja vraca binomni koeficijent - n nad k
binomni<-function(n,k){
  koef<-factorial(n)/(factorial(k)*factorial(n-k))
  return(koef)
}
# Poziv 
binomni(4,2)

# F-ja koja spaja dva vektora kao kolone matrice
spoji<-function(v1,v2){
  return (cbind(v1,v2))
}
# Poziv
spoji(c(0,1,2,3),seq(0,3,1))

# Kad pozivamo f-ju, argumente navodimo istim redom kao u definiciji f-je, osim ako ih navedemo po imenu,onda moze proizvoljno.
binomni(k=2,n=4)

# Funkcija ne mora da sadrzi RETURN naredbu,samo da napravi neke izmene, medjutim one vaze samo u telu f-je
# Npr. f-ja koja racuna kvadrat broja
SQ<-function(x){
  x<-x^2
}
a<-3
SQ(a)
a # nije se izmenilo van funkcije
# ali ako kazemo 
a<-SQ(a)
a

#ZADATAK: Napisati funkciju koja crta dva grafika y(x) i x(y) u proizvoljnoj boji
colors() #sve postojece boje u R-u
crtaj<-function(v1,v2){
  par(mfrow=c(1,2),col="turquoise")
  plot(v1,v2)
  plot(v2,v1)
  par(mfrow=c(1,1),col="black")
}
# Da bismo isprobali rad f-je pravimo dva vektora, koji predstavljaju uzorke iz U[0,1] odnosno N(0,1) raspodele:
x<-sample(1:1000,100)
y<-sample(1:1000,100)
crtaj(x,y)

# FOR, WHILE, REPEAT i IF naredbe:
# Bilo koja celina - blok naredbi, moze se izdvojiti {} zagradama
# ako u konzoli predjemo u novi red a traje blok, on ce staviti + da oznaci to

# IF naredba:
#if(logicki_izraz) naredbe koje se izvrsavaju
#ili if(logicki_izraz) naredbe else naredbe
if(a>3) a<-a-3 else a<-0
a
a<-2
b<-3
c<-4
if(a<b && b<c)
  y<-a*b*c else
    y<-0
# Naredbe su mogle da budu i slozene, samo bi se onda ogranicile sa {}

# FOR petlja:
# sintaksa: for(brojac in start:finish) {naredbe}
for (i in 1:10) print(i)
# primer sa crtanjem grafika pomocu for petlje
# x je niz brojeva 0,0.05,0.1, ..., 1
x<-seq(0,1,0.05)
# Prvo crtamo grafik y=x
plot(x,x,type="l")
# Sada hocemo da nacrtamo preko njega i x^2, x^3,.., x^8:
for(i in 2:8)
{
  lines(x,x^i)
}

# for petlje jedna u drugoj
# Hocemo da napravimo matricu 5*4 gde je a[i,j]=i+j
# Prazna matrica
a<-matrix(nrow=5,ncol=4)
a
for(i in 1:5)
  for(j in 1:4)
    a[i,j]<-i+j
a

# WHILE petlja:
# while (uslov) {naredbe}
x<-1
while(x<=5){
  x<-x+1
}
x

# REPEAT naredba
# sadrzi naredbe koje se izvrsavaju kao i uslov za izlazak iz petlje, inace imamo beskonacnu petlju!
# repeat{ naredbe
# if (uslov) break}
y<-0
repeat{
  y<-y+1
  if(y>=5) break
}
y

# ZADATAK: Napisati f-ju koja racuna faktorijel pomocu for, while ili repeat
# pomocu while petlje:
fact<-function(n){
  f<-1
  while(n>1){
    f<-f*n
    n<-n-1
  }
  return (f)
}

# Vratimo se na bazu sleep
data(sleep)
sleep
#ZADATAK: F-ja kojom se brisu elementi iz baze kod kojih je parametar extra manji od zadatog broja
brisi<-function(x){
  return (sleep[sleep$extra>=x,])
}

# Ako hocemo da f-ja vrati vise stvari, na primer hocemo kao prethodno, ali i da vraca broj obrisanih
# Vracamo dve stavke razlicitog tipa, pa moramo da napravimo listu
brisi1<-function(x){
  return (list(sleep[sleep$extra>=x,],nrow(sleep[sleep$extra<x,])))
}
