############# FUNKCE #############

######## if ... else podminka
# a/ podminka splnena
x <- -5
if (x < 3) {"Podmínka splněna"} else {"Podmínka nesplněna"}
# b/ podminka nesplnena
x <- 5
if (x < 3) {"Podmínka splněna"} else {"Podmínka nesplněna"}
# Zadame pouze if - podminka je splnena
x <- -2
if (x < 3) {"Podmínka splněna"}
# Zadame pouze if - podminka neni splnena
x <- 5
if (x < 3) {"Podmínka splněna"}

# podmínky muzeme "retezit" - vkladat do sebe
x <- 0
if (x > 0) {"Kladné číslo"} else
  if (x < 0) {"Záporné číslo"} else {"Nula"}

# vysledek lze ulozit do sam. objektu
y <- if (x > 0) {"Kladné číslo"} else
  if (x < 0) {"Záporné číslo"} else {"Nula"}
y

# alternativa s ifelse
ifelse(x > 03,"Podmínka splněna","Podmínka nesplněna")

# pozor, chceme-li pouzit vektor o delce vetsi nez jedna bude pouzit jen prvni prvek (warning)
x <- c(0,1)
if (x > 0) {"Kladné číslo"} else
  if (x < 0) {"Záporné číslo"} else {"Nula"}

# ale:
x <- c(-1,0,1,5,-5)
ifelse(x <= 0,"Podmínka splněna", "Podmínka nesplněna")

# Nezapomente, ze prikazy lze vkladat do sebe, priklad:
# kategorie A mensi jak 0
# kategorie B = 0
# kategorie C vetsi jak nula
x <- c(-1,0,1,5,-5)
ifelse(x < 0, "A",ifelse(x > 0, "C", "B"))
# nebo
x <- c(-1,0,1,5,-5)
ifelse(x < 0, "A", ifelse(x == 0, "B", "C"))

# switch - pro jednotlive prvky
switch(2, "child", "young adult", "adult")
switch(3, "child", "young adult", "adult")
switch(4, "child", "young adult", "adult") # neni ctvrta kategorie - nevypise nic

x <- c(1,2,3,4,1,2,3)
switch(x, "child", "young adult", "adult")

data <- read.table("04_data_funkce.txt",header = T)
str(data)
attach(data)

# vekove kategorie (zdroj: White et al. (2011): Human Osteology, Third Edition, Elsevier, p. 384)
# infant + child (0 - 12 let)             ---> I
# adolescent + young adult (13 - 35 let)  ---> A
# middle adult + old adult (> = 36 let)   ---> O

# kategorizujeme data pro vek v objektu data
data$Age_Cat <- ifelse(data$Age < 12, "I",ifelse(data$Age < 35, "A", "O"))
data$Age_Cat

######## for cyklus
for (i in 1:10) {print(i^2)}
i

x <- c(-3,-2,-1,0,1,2,3)
for (i in x) {print(i^2)}

# do for lze vkladat i if ... else cyklus
x <- data$Age
for (i in x) {
  if(i < 12)  print("I") else
    if(i < 35) print("A") else ("O")
}

# pozor:
pok <- for (i in x) {
  if(i < 12)  print("I") else
    if(i < 35) print("A") else ("O")
}
pok # NULL objekt
# obdobne:
pok <- for (i in data$Age) {ifelse(i < 0, "A", ifelse(i == 0, "B", "C"))}
pok # NULL objekt

####### ulozeni vysledku for cyklu ########
# jednoduchy priklad
vektor_pok_1 = c()                                           # vytvoreni prazdneho objektu
length(vektor_pok_1)                                         # delka vektoru je 0
for(i in 1:3) {vektor_pok_1[length(vektor_pok_1)+1] <- i^3}  # for cyklus
vektor_pok_1                                                 # objekt obsahuje vysledky cyklu
length(vektor_pok_1)

# nase data
vektor_pok_2 = c()
for (i in data$Age) {vektor_pok_2[length(vektor_pok_2) + 1] <-  
  if(i < 12)  print("I") else
    if(i < 35) print("A") else ("O")}
vektor_pok_2
data$pok_2 <- vektor_pok_2

data$Age_Cat == data$pok_2

# nebo
vektor_pok_3 = c()
for (i in data$Age) {vektor_pok_3[length(vektor_pok_3) + 1] <-  
  ifelse(i < 12, "I",ifelse(i < 35, "A", "O"))}
vektor_pok_3
data$pok_3 <- vektor_pok_3

# POZOR! v pripade, ze chceme do vektoru ulozit najednou vice jak jedno cislo, nastane problem, kdy se do jedne dimenze
# (do polohy 1 v delce vektoru) snazime "nacpat" 3 cisla
vysledek = c()                                           
for(i in 1:3) {vysledek[length(vysledek)+3] <- c(i^3,i-2,i)}  
vysledek                                               
length(vysledek)

# Ale vypiseme-li to postupne, problem tak odstranime:
vysledek = c()                                           
for(i in 1:3) {
  vysledek[length(vysledek)+1] <- i^3
  vysledek[length(vysledek)+1] <- i-2
  vysledek[length(vysledek)+1] <- i
}  
vysledek 
length(vysledek)

# Nebo nemusime delku vektoru uvazovat vubec a budeme vektory "slucovat"
vysledek_2 = c()
for(i in 1:3){vysledek_2 = c(vysledek_2,i^3,i-2,i)}
vysledek_2

# coz lze pouzit opet i na nase data
vektor_pok_4 <- c()
for (i in data$Age) {vektor_pok_4 = c(vektor_pok_4, ifelse(i < 12, "I",ifelse(i < 35, "A", "O")))}
vektor_pok_4
data$pok_4 <- vektor_pok_4

# jine pouziti s prikazem switch
vysledek_4 <- c()
for (i in data$Cat) {vysledek_4 = c(vysledek_4, switch(i, "cribra orbitalia nepřítomna", "cribra orbitalia přítomna", "chybí lebka"))}
data$vysledek_4 <- vysledek_4
data$vysledek_4

# apply
ma <- matrix(1:20, 4, 5)
ma

apply(X = ma, MARGIN = 1, FUN = mean)
apply(ma,1,mean) # prumer po radcich
apply(ma,2,mean) # prumer po sloupcich

apply(ma,1,sum)

# prevod radianu na stupne a obracene

podil <- function(citatel, jmenovatel)
{ result <- citatel/jmenovatel 
return(result)
}
podil

podil(citatel = 2, jmenovatel = 4)
podil(2,4)
podil(jmenovatel = 4, citatel = 2)
# ale
podil(4,2)

podil_2 <- function(citatel, jmenovatel)
{ result <- citatel/jmenovatel 
print(result)
}
podil_2(4,2)

# rozdil ve vypisu hodnot
A <- podil(4,2)
B <- podil_2(4,2)

# R dokaze odvodid argument i ze "zkratky"
podil_2(ci = 4, jm = 2)
podil_2(jm = 2, ci = 4)

# meli jsme if... else podminku:
x <- 0
if (x > 0) {"Kladné číslo"} else
  if (x < 0) {"Záporné číslo"} else {"Nula"}

# nyni tuto podminku upravime na funkci:
cislo <- function(x) {
  if (x > 0) {result = "Kladné číslo"}
  else if (x < 0) {result = "Záporné číslo"}
  else {result = "Nula"}
  return(result)
}

cislo(-5)
cislo(0)
cislo(5)

# euklidovska vzdalenost
x1 <- c(0,0)
x2 <- c(1,2)
x2 - x1


euc_dist <- function(x1, x2) {
  sqrt(sum((x1 - x2)^2))
}
euc_dist(x2,x1)


A <- c(0,0,0)
B <- c(1,2,3)
euc_dist(A,B)


c <- A-B
c
