Learning Objectives
- Describe what loops are.
- Understand the differences and different uses of
for
loops andwhile
loops.- Understand how to use
break
andnext
statements inside loops.Suggested Readings
- Chapter 21 of “R for Data Science”, by Garrett Grolemund and Hadley Wickham
- Chapters 11 of “Hands-On Programming with R”, by Garrett Grolemund
Similar to conditionals (remember those if / else statements?), loops are another kind of “flow control” - that is, code that alters the otherwise linear flow of operations from the top of a script straight through to the end. The idea is simple: a loop is a block of code (i.e., a sequence of commands) that R will execute over and over again until some termination criterion is met.
The main two types of loops are for
and
while
loops.
for
loopUse for
loops when there is a known number of
iterations. The basic format of a for
loop goes like
this:
for (VALUE in SEQUENCE) {
STATEMENT1
STATEMENT2
ETC
}
In a for
loop, R runs a fixed number of iterations
determined by the SEQUENCE
statement, which is a sequence
of values. In each iteration, the variable VALUE
will take
the next value in SEQUENCE
. Once we’ve exhausted all of the
values in SEQUENCE
, the loop terminates and the flow of the
program continues down the script. This schematic illustrates the
idea:
It is common to use a sequence of integers for the values in
SEQUENCE
. The simplest way to do this is to use the
:
operator. For example, the code 1:10
creates
the integers 1 through 10. The following for
loop uses this
sequence to print out each integer in the sequence:
# Print the numbers from 1 to 10
for (i in 1:10) {
print(i)
}
#> [1] 1
#> [1] 2
#> [1] 3
#> [1] 4
#> [1] 5
#> [1] 6
#> [1] 7
#> [1] 8
#> [1] 9
#> [1] 10
You can also use the seq()
function to generate a
specific sequence of numbers over which to iterate. This can be useful
if you want to control the step size (in the example below, it’s 2):
# Print the numbers from 1 to 10 with a step size of 2
for (i in seq(1, 10, by=2)) {
print(i)
}
#> [1] 1
#> [1] 3
#> [1] 5
#> [1] 7
#> [1] 9
R will loop over any sequence you create. For example, you can loop
over a vector of characters (The c()
function creates a
“vector”…we’ll get to those next
lesson):
x <- c('If', 'you', 'want', 'to', 'view', 'paradise,', 'simply', 'look',
'around', 'and', 'view', 'it.')
for (i in x) {
print(i)
}
#> [1] "If"
#> [1] "you"
#> [1] "want"
#> [1] "to"
#> [1] "view"
#> [1] "paradise,"
#> [1] "simply"
#> [1] "look"
#> [1] "around"
#> [1] "and"
#> [1] "view"
#> [1] "it."
You can also loop over logical values. The following loop will print
out the value when it is TRUE
:
x <- c(TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE)
for (i in x) {
if (i == TRUE) {
print(i)
}
}
#> [1] TRUE
#> [1] TRUE
#> [1] TRUE
for
loopsYou can have loops inside loops! This is useful when working on
things that have more than one dimension. For example, let’s print out a
5 x 5 rectangle out of asterisks (*
) by looping over rows
and columns:
n <- 5
for (row in seq(n)) {
for (col in seq(n)) {
cat("*")
}
cat('\n') # Print a new line
}
#> *****
#> *****
#> *****
#> *****
#> *****
This will come in handy when working with 2-dimensional objects like data frames.
while
loopA friend calls her programmer roommate and says, “while you’re out, buy some milk”…her roommate never returned home.
Use while loops when there is an indeterminate number of iterations. The basic format of the loop looks like this:
while (CONDITION) {
STATEMENT1
STATEMENT2
ETC
}
The code corresponding to CONDITION
needs to produce a
logical value, either TRUE
or FALSE
. Whenever
R encounters a while statement, it checks to see if the condition is
TRUE
. If it is, R goes on to execute all of the commands
inside the curly brackets. R will then continue to repeat this process
until the condition is FALSE
. Once that happens, R jumps to
the bottom of the loop (i.e., to the }
character), and then
continues on with whatever commands appear next in the script. This
schematic illustrates the idea:
Example:
The following function prints each power of 2 up to an upper limit:
powersOfTwo <- function(upperLimit) {
n = 1
while (n < upperLimit) {
print(n)
n = 2*n
}
}
powersOfTwo(5)
#> [1] 1
#> [1] 2
#> [1] 4
powersOfTwo(100)
#> [1] 1
#> [1] 2
#> [1] 4
#> [1] 8
#> [1] 16
#> [1] 32
#> [1] 64
You can force a loop to stop by inserting the break
statement in the loop. In a nested loop, the break
statement exits from the innermost loop that is being evaluated. Here’s
an example:
for (val in 1:5) {
if (val == 3) {
break
}
print(val)
}
#> [1] 1
#> [1] 2
In this example, we iterate over the consecutive numbers from 1 to 5. Inside the for loop we have used a if condition to break if the current value is equal to 3. As we can see from the output, the loop terminates when it encounters the break statement.
A next
statement is useful when we want to skip the
current iteration of a loop without terminating it. On encountering
next
, R will jump to the end of the loop and start the next
iteration. Here’s an example:
for (val in 1:5) {
if (val == 3) {
next
}
print(val)
}
#> [1] 1
#> [1] 2
#> [1] 4
#> [1] 5
In the above example, we use the next
statement inside
an if
statement to check if the value is equal to 3. If the
value is equal to 3, the current evaluation stops (i.e. the value is not
printed) and the loop continues with the next iteration.
Page sources:
Some content on this page has been modified from other courses, including: