Igor Hut
14.11.2016
TRUE == TRUE
[1] TRUE
TRUE == FALSE
[1] FALSE
1 == 1
[1] TRUE
1 == 2
[1] FALSE
"isto" == "isto"
[1] TRUE
"isto" == "razlicito"
[1] FALSE
TRUE != TRUE
[1] FALSE
TRUE != FALSE
[1] TRUE
1 != 1
[1] FALSE
1 != 2
[1] TRUE
"isto" != "isto"
[1] FALSE
"isto" != "razlicito"
[1] TRUE
1 < 2
[1] TRUE
1 > 2
[1] FALSE
1 > 1
[1] FALSE
"Dobar dan !" > "Zdravo!" # Abecedni poredak
[1] FALSE
TRUE > FALSE # TRUE = 1, FALSE = 0
[1] TRUE
1 >= 1
[1] TRUE
"Cao!" <= "Cao!"
[1] TRUE
TRUE >= 1 # ispod haube TRUE = 1
[1] TRUE
a <- c(3:7, 23, 11:9, 99, 0, -5)
a
[1] 3 4 5 6 7 23 11 10 9 99 0 -5
b <- c(4:6, 32, 12, 1, 67, -9, 3, 22, 1, -5)
b
[1] 4 5 6 32 12 1 67 -9 3 22 1 -5
a >= b
[1] FALSE FALSE FALSE FALSE FALSE TRUE FALSE TRUE TRUE TRUE FALSE
[12] TRUE
a[a>=b] #izdvaja elemente vektora a koji zadovoljavaju dati uslov!
[1] 23 10 9 99 -5
TRUE & TRUE # iskaz je tacan akko su obe tvrdnje tacne
[1] TRUE
TRUE & FALSE
[1] FALSE
FALSE & TRUE
[1] FALSE
FALSE & FALSE
[1] FALSE
2 > 1 & 2 <= 2
[1] TRUE
TRUE | TRUE # dovoljno je da samo jedan od clanova u iskazu bude tacan
[1] TRUE
TRUE | FALSE
[1] TRUE
FALSE | TRUE
[1] TRUE
FALSE | FALSE # iskaz je netacan akko su obe tvrdnje netacne
[1] FALSE
1 > 3 | 5 ==5
[1] TRUE
!TRUE
[1] FALSE
!FALSE
[1] TRUE
!(3 > 5)
[1] TRUE
is.character(5)
[1] FALSE
!is.character(5)
[1] TRUE
is.numeric("string")
[1] FALSE
!is.numeric("string")
[1] TRUE
c(TRUE, FALSE, TRUE) & c(TRUE, TRUE, TRUE)
[1] TRUE FALSE TRUE
c(TRUE, FALSE, TRUE) | c(TRUE, TRUE, TRUE)
[1] TRUE TRUE TRUE
!c(TRUE, FALSE, FALSE)
[1] FALSE TRUE TRUE
&&
i ||
porede samo prve elemente vektora!
c(TRUE, FALSE, TRUE) & c(TRUE, TRUE, TRUE)
[1] TRUE FALSE TRUE
c(TRUE, FALSE, TRUE) | c(TRUE, TRUE, TRUE)
[1] TRUE TRUE TRUE
c(TRUE, FALSE, TRUE) && c(TRUE, TRUE, TRUE)
[1] TRUE
c(TRUE, FALSE, TRUE) || c(TRUE, TRUE, TRUE)
[1] TRUE
if(condition) {
expr
}
x <- 5
if(x < 0) {
print("x je negativan broj")
} # FALSE => kod se ne izvrsava, odn. u ovom slucaju poruka nece biti ispisana.
if(x > 0) {
print("x je pozitivan broj")
} # u ovom slucaju uslov je zadovoljen (TRUE) i poruka biva ispisana u konzoli.
[1] "x je pozitivan broj"
if(condition) {
expr1
} else {
expr2
}
x <- -3
if(x < 0) {
print("x je negativan broj")
} else {
print("x je pozitivan broj ili nula")
}
[1] "x je negativan broj"
if(condition) {
expr1
} else {
expr2
}
x <- 3
if(x < 0) {
print("x je negativan broj")
} else {
print("x je pozitivan broj ili nula")
}
[1] "x je pozitivan broj ili nula"
if(condition1) {
expr1
} else if(condition2) {
expr2
} else {
expr3
}
x <- -3
if(x < 0) {
print("x je negativan broj")
} else if(x == 0) {
print("x je nula")
} else {
print("x je pozitivan broj")
}
[1] "x je negativan broj"
if(condition1) {
expr1
} else if(condition2) {
expr2
} else {
expr3
}
x <- 0
if(x < 0) {
print("x je negativan broj")
} else if(x == 0) {
print("x je nula")
} else {
print("x je pozitivan broj")
}
[1] "x je nula"
if(condition1) {
expr1
} else if(condition2) {
expr2
} else {
expr3
}
x <- 3
if(x < 0) {
print("x je negativan broj")
} else if(x == 0) {
print("x je nula")
} else {
print("x je pozitivan broj")
}
[1] "x je pozitivan broj"
x <- 6
if((x %% 2 == 0)&(x %% 3 == 0 )) {
print("deljivo sa 2 i sa 3")
} else if (x %% 2 == 0) {
print("deljivo sa 2")
} else if (x %% 3 == 0) {
print("deljivo sa 3 ")
} else {
print("nije deljivo ni sa 2 ni sa 3...")
}
[1] "deljivo sa 2 i sa 3"
x <- 4
if((x %% 2 == 0)&(x %% 3 == 0 )) {
print("deljivo sa 2 i sa 3")
} else if (x %% 2 == 0) {
print("deljivo sa 2")
} else if (x %% 3 == 0) {
print("deljivo sa 3 ")
} else {
print("nije deljivo ni sa 2 ni sa 3...")
}
[1] "deljivo sa 2"
while(condition) {
expr
}
while(condition) {
expr
}
ctr <- 1
while(ctr <= 7) {
print(paste("ctr je jednako", ctr))
ctr <- ctr + 1
}
[1] "ctr je jednako 1"
[1] "ctr je jednako 2"
[1] "ctr je jednako 3"
[1] "ctr je jednako 4"
[1] "ctr je jednako 5"
[1] "ctr je jednako 6"
[1] "ctr je jednako 7"
ctr # obrati paznju, nakon poslednje iteracije "ctr" ce imati vrednost 8 i nece ispunjavati uslov da bude ispisano
[1] 8
ctr <- 1
while(ctr <= 7) {
print(paste("ctr je jednako", ctr))
}
ctr <- 1
## prekini izvrsavanje ako je 'ctr' deljivo sa 5
while(ctr <= 7) {
if(ctr %% 5 == 0) { #ako je ovo tacno (TRUE) prekida se izvrsavanje petlje
break
}
print(paste("ctr je jednako", ctr))
ctr <- ctr + 1
}
[1] "ctr je jednako 1"
[1] "ctr je jednako 2"
[1] "ctr je jednako 3"
[1] "ctr je jednako 4"
for(var in seq) {
expr
}
for(var in seq) {
expr
}
gradovi <- c("Beograd", "New York", "Paris", "London", "Tokyo", "Prnjavor")
for(grad in gradovi) {
print(grad)
}
[1] "Beograd"
[1] "New York"
[1] "Paris"
[1] "London"
[1] "Tokyo"
[1] "Prnjavor"
gradovi <- c("Beograd", "New York", "Paris", "London", "Tokyo", "Prnjavor")
for(grad in gradovi) {
if(nchar(grad) == 6) { #ako tekuci string ima duzinu od 6 karaktera prekida se izvrsavanje petlje (u nasem slucaju to ce se desiti kada na red dodje "London")
break
}
print(grad)
}
[1] "Beograd"
[1] "New York"
[1] "Paris"
Naredba next
nam omogucava da preskocimo iteraciju.
for(grad in gradovi) {
if(nchar(grad) == 6) { #ako tekuci string ima duzinu od 6 karaktera nece biti izvrsen kod u datoj iteraciji (u nasem slucaju to ce se desiti kada na red dodje "London")
next
}
print(grad)
}
[1] "Beograd"
[1] "New York"
[1] "Paris"
[1] "Tokyo"
[1] "Prnjavor"
# Kao sto vidite "London" nije ispisan.
gradovi <- c("Beograd", "New York", "Paris", "London", "Tokyo", "Prnjavor")
for(grad in gradovi) {
print(grad)
}
[1] "Beograd"
[1] "New York"
[1] "Paris"
[1] "London"
[1] "Tokyo"
[1] "Prnjavor"
gradovi <- c("Beograd", "New York", "Paris", "London", "Tokyo", "Prnjavor")
for(i in 1:length(gradovi)) {
print(gradovi[i])
}
[1] "Beograd"
[1] "New York"
[1] "Paris"
[1] "London"
[1] "Tokyo"
[1] "Prnjavor"
gradovi <- c("Beograd", "New York", "Paris", "London", "Tokyo", "Prnjavor")
for(i in 1:length(gradovi)) {
print(paste(gradovi[i], "je na poziciji", i, "u vektoru 'gradovi'."))
}
[1] "Beograd je na poziciji 1 u vektoru 'gradovi'."
[1] "New York je na poziciji 2 u vektoru 'gradovi'."
[1] "Paris je na poziciji 3 u vektoru 'gradovi'."
[1] "London je na poziciji 4 u vektoru 'gradovi'."
[1] "Tokyo je na poziciji 5 u vektoru 'gradovi'."
[1] "Prnjavor je na poziciji 6 u vektoru 'gradovi'."
gradovi <- c("Beograd", "New York", "Paris", "London", "Tokyo", "Prnjavor")
for(grad in gradovi) {
print(grad)
}
[1] "Beograd"
[1] "New York"
[1] "Paris"
[1] "London"
[1] "Tokyo"
[1] "Prnjavor"
gradovi <- c("Beograd", "New York", "Paris", "London", "Tokyo", "Prnjavor")
for(i in 1:length(gradovi)) {
print(gradovi[i])
}
[1] "Beograd"
[1] "New York"
[1] "Paris"
[1] "London"
[1] "Tokyo"
[1] "Prnjavor"
list()
, sum()
, c()
, head()
itd.help(sd)
?sd
args(sd)
function (x, na.rm = FALSE)
NULL
argumenti koji se prosledjuju f-ji sd()
su vektor brojnih vrednosti x
i na.rm
koji ukazuje na to da li ce se vrsiti uklanjanje NA
vrednosti prilikom racunajna standardne devijacije ili ne.
x
nema podrazumevanu vrednost, dok je na.rm = FALSE
podrazumevano!Argumenti mogu da se prosledjuju na dva nacina:
vec <- c(1,2,3,4,5,NA)
sd(vec)
[1] NA
sd(vec, TRUE) # "matching by position"
[1] 1.581139
sd(na.rm = TRUE, x = vec) # "matching by name"
[1] 1.581139
sd(TRUE, vec) # sta je ovde problem?
[1] NA
vek_1 <- c(16, 9, 13, 5, NA, 17, 14)
vek_2 <- c(17, NA, 5, 16, 8, 13, 14)
# Izracunajte srednje apsolutno odstupanje
mean(abs(vek_1 - vek_2), na.rm=TRUE)
[1] 4.8
ime_f-je <- function(arg1, arg2, ...) {
telo f-je
}
Primer:
# F-ja sum_abs() koja racuna sumu apsolutnih vrednosti dva broja
sum_abs<-function(x,y){
abs(x)+abs(y)
}
# Primer upotrebe
sum_abs(-2,3)
[1] 5
Primer:
baci_kockicu <- function() {
broj <- sample(1:6, size = 1)
broj
}
baci_kockicu()
[1] 3
ime_f <- function(arg1, arg2 = val2) {
body
}
kv_info <- function(x, print_info = TRUE) {
y <- x ^ 2
if (print_info) {
print(paste(x, "na kvadrat daje", y))
}
return(y)
}
kv_info(5)
[1] "5 na kvadrat daje 25"
[1] 25
kv_info(3, print_info = FALSE)
[1] 9
Primer:
kv <- function(x){
y <- x ^ 2
return(y)
}
kv(4)
[1] 16
# x
# y
y
je definisano unutar funkcije kv()
te s' toga nije dostupno van prostora promenljivih same funkcije.x
takodje nije dostupna van prostora promenljivih same funkcije kv()
.U kontekstu funkcija ovo znaci da primenom funkcije na neku promenljivu ne mozemo promeniti vrednost te iste promenljive!
“Passing by reference” - promena vrednosti promenljive u telu funkcije se prenosi i u globalni prostor promenljivih.
triple <- function(x) {
x <- 3*x
x
}
a <- 5
triple(a)
[1] 15
a
[1] 5
Koja je od sledecih izjava netacna vezano za prikazani blok koda:
increment()
, u kome je vrednost a
definisana, a
je jednako 7 dok count
ima vrednost 5.count
ce imati vrednost 10.count
je izmenjena jer je izvresena eksplicitna dodela vrednosti.increment <- function(x, inc = 1) {
x <- x + inc
x
}
count <- 5
a <- increment(count, 2)
b <- increment(count)
count <- increment(count, 2)
Formirajte “data frame” pritisak
koji sadrzi kolone pritisak_sist
i pritisak_dijast
u kojima se nalaze vrednosti odgovarajucih parametara tj. sistolnog i dijastolnog krvnog pritiska za pojedinacne pacijente. Unesite vrednosti za 10 pacijenata.
Dovrsite zapocetu funkciju interpret
koja daje odgovarajuci odziv u zavisnosti od vrednosti ovih parametara:
prit_s
i prit_d
koji se odnose na sistolni i dijastolni krvni pritisak za konkretnog pacijenta.prit_s
veca od 120 f-ja a manja od 190 ispisuje poruku “Povisen gornji pritisak!”, ako je prit_d
veca od 80 i manja od 100 fja ispisuje poruku “Povisen donji pritisak!”, ako je prit_s
manji od 120 i veci od 90 ispisuje poruku “Normalan gornji pritisak.”, ako je prit_d
manji od 80 i veci od 60 ispisuje poruku “Normalan donji pritisak”, ako prit_s
ima vrednost izmedju 70 i 90 ispisuje “Nizak gornji pritisak!”, ako prit_d
ima vrednost u rasponu 40-60 ispisuje “Nizak donji pritisak!”, a ako nijedan od ovih uslova nije zadovoljen ispisuje poruku “Svaka cast!”.Pozovite ovu funkciju dva puta, prvi put za pacijenta br.1 drugi put za pacijenta br.5.
interpret <- function(prit_s, prit_d) {
if (prit_s > 120 & prit_s < 190) {
print("Povisen gornji pritisak!")
} else if (prit_s < 120 & prit_s > 90){
print("Normalan gornji pritisak!")
} else if (){
...
}
...
}
dijagnoza
sa odgovarajucim porukama definisanim kao u proslom zadatku.return_sum
ima vrednost TRUE
. Neka TRUE
bude podrazumevana vrednost ovog argumenta.sum(vekt > prag)
gde je “prag” konkretna brojna vrednost.interpret_sum <- function(prit_s, prit_d, ______) {
dijagnoza <- list(prit_sis = "", prit_dijast = "")
for( i in 1:length(prit_s)){
if (prit_s > 120 & prit_s < 190) {
dijagnoza_prit_sis[i] <- ("Povisen gornji pritisak!")
} else if (prit_s < 120 & prit_s > 90){
...
} else if (){
...
}
}
...
if(______){
sum_g = 0
...
for(i in prit_s > 120){
sum_g <- sum_g + 1
}
...
paste("Broj pacijenata sa povisenim sistolnim pritiskom je:", sum_g)
...
}
}
lapply
ali pokusava da uprosti rezultat.lapply
sapply
lapply(X, FUN, ...)
X
je niz ili vektor nad cijim elementima zelima da izvrsimo funkciju FUN
FUN
zahteva upotrebu dodatnih argumenata oni se prosledjuju nakon njenog pozivanja (...
)# Podaci za New York
nyc <- list(pop = 8405837,
boroughs = c("Manhattan", "Bronx", "Brooklyn","Queens", "Staten Island"),
capital = FALSE)
# Interesuje nas kojoj klasi pripadaju elementi liste 'nyc'
# Resenje pomocu 'for' petlje
for(info in nyc) {
print(class(info))
}
[1] "numeric"
[1] "character"
[1] "logical"
#resenje primenom funkcije 'lapply()`
lapply(nyc, class)
$pop
[1] "numeric"
$boroughs
[1] "character"
$capital
[1] "logical"
gradovi <- c("New York", "Paris", "London", "Tokyo","Beograd", "Rio de Janeiro", "Cape Town")
# Interesuje nas broj karaktera za svaki clan ovog vektora
# Resenje koriscenjem 'for' petlje
num_chars <- c()
for(i in 1:length(gradovi)) {
num_chars[i] <- nchar(gradovi[i])
}
num_chars
[1] 8 5 6 5 7 14 9
# Resenje koriscenjem funkcije 'lapply'
lapply(gradovi, nchar)
[[1]]
[1] 8
[[2]]
[1] 5
[[3]]
[1] 6
[[4]]
[1] 5
[[5]]
[1] 7
[[6]]
[1] 14
[[7]]
[1] 9
#Da bismo dobili vektor a ne listu
unlist(lapply(gradovi, nchar))
[1] 8 5 6 5 7 14 9
# Uporedi sa sapply
sapply(gradovi, nchar)
New York Paris London Tokyo Beograd
8 5 6 5 7
Rio de Janeiro Cape Town
14 9
str(sapply(gradovi, nchar))
Named int [1:7] 8 5 6 5 7 14 9
- attr(*, "names")= chr [1:7] "New York" "Paris" "London" "Tokyo" ...
lista_onako <- list(2.37, 2.49, 2.18, 2.22, 2.47, 2.32)
triple <- function(x) {
3 * x
}
res <- lapply(lista_onako, triple)
str(res)
List of 6
$ : num 7.11
$ : num 7.47
$ : num 6.54
$ : num 6.66
$ : num 7.41
$ : num 6.96
unlist(res)
[1] 7.11 7.47 6.54 6.66 7.41 6.96
mnozenje <- function(x, faktor) {
faktor * x
}
res_3 <- lapply(lista_onako, mnozenje, 3)
unlist(res_3)
[1] 7.11 7.47 6.54 6.66 7.41 6.96
res_4 <- lapply(lista_onako, mnozenje, 4)
unlist(res_4)
[1] 9.48 9.96 8.72 8.88 9.88 9.28
res_an <- lapply(lista_onako, function(x){x * 3})
unlist(res_an)
[1] 7.11 7.47 6.54 6.66 7.41 6.96
res_an_mn <- lapply(lista_onako, function(x, faktor){x * faktor}, 3)
unlist(res_an_mn)
[1] 7.11 7.47 6.54 6.66 7.41 6.96
library(purrr)
res_map <- map(lista_onako, mnozenje, 3) #vraca listu ili data frame
str(res_map)
List of 6
$ : num 7.11
$ : num 7.47
$ : num 6.54
$ : num 6.66
$ : num 7.41
$ : num 6.96
res_map_dbl <- map_dbl(lista_onako, mnozenje, 3) #vraca vektor tipa numeric (double)
str(res_map_dbl)
num [1:6] 7.11 7.47 6.54 6.66 7.41 6.96