Upload
kovit
View
18
Download
0
Tags:
Embed Size (px)
DESCRIPTION
R basics workshop. J. Sebasti án Tello Iván Jiménez. Center for Conservation and Sustainable Development Missouri Botanical Garden. 9 . Flow Control. F low control lets you define how your scripts run. - PowerPoint PPT Presentation
Citation preview
R basics workshopJ. Sebastián TelloIván JiménezCenter for Conservation and Sustainable DevelopmentMissouri Botanical Garden
9. Flow Control
Flow control lets you define how your scripts run
• There are a number of constructs in R that allow you to control the flow of the code
• There are mainly 3 types:
• Loops – for, while, repeat• Breaking points – break, next• Conditionals – if, else and ifelse
• We will focus on: for, while and if
• For help:
?Control
“for” loops
• A loop is the repetition of a piece of code “n” times
• for is the most common construct to create loops
• This is the general structure of a “for” loop:
for(i in v){
code…}
For each value that i takes from vector v, repeat:{
this code}
Which means:
Tab/space
• Easy example 1:
v <- 1:10
for(i in v){
print(i)}
The vector v has values from 1 to 10 every 1
For each value that i takes from vector v, repeat:print the value of i into the screen
“for” loops
Which means:
• Easy example 2:
v <- letters
v
for(i in v){
print(i)}
“for” loops
• Easy example 3:
v <- letters
length(v)
result <- 0
for(i in v){
print(i)result <- result + 1
}
result
“for” loops
v <- c(1,3,5,2,4)
result <- 0
for(i in 1:length(v)){
print( c(i, v[i]) )
result <- result + v[i]}
result
• Easy example 4:
“for” loops
col.v <- rainbow(100)cex.v <- seq(1, 10, length.out=100)
plot(0:1, 0:1, type="n")
for(i in 1:200){
print(i)
points(runif(1), runif(1), pch=16, col=sample(col.v, 1), cex=sample(cex.v, 1))
Sys.sleep(0.1)}
• Easy example 5:
“for” loops
BatData <- read.table(file=file.choose(),header=TRUE, sep="\t")
Or if the files is in your working directory:
BatData <- read.table(file="BatsEnviroAmerica.txt",header=TRUE, sep="\t")
• Open the file “BatsEnviroAmerica.txt”
“for” loops
class(BatData)
names(BatData)
rich <- BatData$richness
enviro <- BatData[,5:ncol(BatData)]
enviro[1:5, ]
• Open the file “BatsEnviroAmerica.txt”
“for” loops
LM.R2 <- rep(NA, ncol(enviro))
LM.R2
for(i in 1:ncol(enviro)){
LM.i <- lm(rich ~ enviro[,i])
res.LM.i <- summary(LM.i)
LM.R2[i] <- res.LM.i$adj.r.squared}
LM.R2
“for” loops
LM.R2
names(LM.R2) <- names(enviro)
barplot(LM.R2)
“for” loops
“while” loops
• while is sometimes also very useful
• This is the general structure of a “while” loop:
while(condition){
code…}
While this condition is TRUE, repeat:{
this code}
Which means:
• Easy example 1:
v <- 1:10for(i in v){
print(i)}
“while” loops
v <- 1:10i <- 0while(i < max(v)){
i <- i+1print(i)
}
• Easy example 1:
“while” loops
i <- 0while(i < max(v)){
i <- i+1print(i)
}
i <- 0while(i < max(v)){
print(i)i <- i+1
}
Version 1
Version 2
v <- 1:10
“while” loops
Bp <- 0.1; Dp <- 0.1; Np <- 1-Bp-Dp
max.t <- 100; time <- 0; abund <- 10
plot(c(0, max.t), c(0, 100), type="n")
while(abund>0 & time<= max.t){
change <- sample(c(-1,0,1), size=abund, prob=c(Dp, Np, Bp), replace=TRUE)
abund <- abund + sum(change)time <- time + 1
points(time, abund, pch=16, col="black")}
• Easy example 2:
• if controls the flow by allowing code to run only if a condition is met
• Easy example 1:v <- 1:10
for(i in v){
print(i)
if(i == 5)print("Reached 5")
}
“if” condition
• if controls the flow by allowing code to run only if a condition is met
• Easy example 1:v <- 1:10
for(i in v){
print(i)
if(i == 5){
print("Reached 5")break()
}}
“if” condition and “break”
trait <- 0; max.time <- 100
plot(c(0,max.time), c(-20, 20), type="n", ylab="Trait Value", xlab="Time")
points(0, trait, pch=16, col="black")
for(i in 1:max.time){
trait.shift <- rnorm(1, 0, 0.5)trait <- trait + trait.shift
if(trait.shift > 0) COL <- "gold"if(trait.shift < 0) COL <- "lightblue"
points(i, trait, pch=16, col=COL)
Sys.sleep(0.2)}
“if” condition
M <- matrix(rpois(50000000, 10), ncol=50)
M[1:5,]
dim(M)
Avoiding loops
• Loops are extremely useful, but slow. When possible, avoid them.
• Often, you will be working with large data sets. Lets simulate a matrix of 50 species abundances in 1,000,000 sites
abund.1 <- numeric()
system.time( { for(i in 1:nrow(M)) {
abund.1 <- c(abund.1, sum(M[i,])) }
})
Avoiding loops
• How to calculate the number of individuals at each site (sum by rows)?
• Option 1 – a ‘for’ lool
abund.2 <- rep(NA, nrow(M))
system.time( { for(i in 1:nrow(M)) {
abund.2[i] <- sum(M[i,]) }
})
Avoiding loops
• How to calculate the number of individuals at each site (sum by rows)?
• Option 2 – a better ‘for’ lool
system.time( { abund.3 <- apply(M, 1, sum)})
?apply
Avoiding loops
• How to calculate the number of individuals at each site (sum by rows)?
• Option 3 – use a function of the family ‘apply’
system.time( { abund.4 <- colSums(M)})
Vectorization
• How to calculate the number of individuals at each site (sum by rows)?
• Option 4 – Vectorize! Use a built-in function in R that was written in other code (e.g., C, C++, Fortran)
Exercise 9Flow Control