9/11/2018

for loops

for loops will be familiar if you have ever used any other programming languages. The basic structure looks like this:

vector <- 1:10
for(i in vector){
  #do something with i
}

for loops

Here is a (slightly) more complicated example.

myVector <- 1:10
for(counter in myVector){
  result <- paste("counter ^ 2 = ", counter^2)
  print(result)
}
## [1] "counter ^ 2 =  1"
## [1] "counter ^ 2 =  4"
## [1] "counter ^ 2 =  9"
## [1] "counter ^ 2 =  16"
## [1] "counter ^ 2 =  25"
## [1] "counter ^ 2 =  36"
## [1] "counter ^ 2 =  49"
## [1] "counter ^ 2 =  64"
## [1] "counter ^ 2 =  81"
## [1] "counter ^ 2 =  100"

explanation of previous loop

  • We loop over a vector 1:100, and sequentially assign its values to a temporary variable we are calling counter. (Note: we can call this variable whatever we want.)
  • Then R does what is within the curly braces {} for each iteration of the loop.
  • In this case, it pastes together some text with the square of the value of counter and prints this all to the console.

  • After running the above code, what is the value of counter? What is the value of myVector? Has this value changed?

getting stuff out of a loop

  • Create a results vector in advance that is the same length as the vector we are looping over
  • Then save the results each time in the appropriate slot.
integers <- c(10, 9, 8)
results <- numeric(3)
for(i in 1:length(results)){
  results[i] <- integers[i] + 1
}

results
## [1] 11 10  9

note…this is a great example of an unnecessary for() loop!

if statements

  • Often during a loop, you may want to do diffent things based on a test
  • Imagine a vector of germination outcomes from a seed experiment.
    • 0 indicates the seed did not germinate
    • 1 indicates that the seed germinated
  • We can use the if() function to evaluate the outcome and provide context specific output.

outcomes <- c(0,1,0,1,0,1,0,1,0,1,0,1,0,0)
for(trial in outcomes){
  if(trial == 1) print("Welcome to the world, plantling!")
  else print("RIP")
}
## [1] "RIP"
## [1] "Welcome to the world, plantling!"
## [1] "RIP"
## [1] "Welcome to the world, plantling!"
## [1] "RIP"
## [1] "Welcome to the world, plantling!"
## [1] "RIP"
## [1] "Welcome to the world, plantling!"
## [1] "RIP"
## [1] "Welcome to the world, plantling!"
## [1] "RIP"
## [1] "Welcome to the world, plantling!"
## [1] "RIP"
## [1] "RIP"

Challenge

Write a for loop to show how, as sample size increases, estimates of the mean of a population converge on the true value (this is known as the law of large numbers)

  • create a numeric results vector of length 2000
  • loop over each integer i from 1 to 2000
  • at each iteration use the rnorm() function to simulate a sample of size i from a population with a mean of 100 and standard deviation of 30.
  • calculate the mean of this sample, and be sure to save these results to the appropriate place in the results vector
  • finally, make a plot of the results with the integers 1 to 2000 on the x axis, and the corresponding value from the results vector on the y axis