Although for-loops are an important concept to understand, in R we rarely use them. As you learn more R, you will realize that vectorization is preferred over for-loops since it results in shorter and clearer code. We already saw examples in the Vector Arithmetic section. A vectorized function is a function that will apply the same operation on each of the vectors.
x <- 1:10
sqrt(x)
#> [1] 1.00 1.41 1.73 2.00 2.24 2.45 2.65 2.83 3.00 3.16
y <- 1:10
x*y
#> [1] 1 4 9 16 25 36 49 64 81 100
To make this calculation, there is no need for for-loops. However, not
all functions work this way. For instance, the function we just wrote,
compute_s_n
, does not work element-wise since it is expecting a
scalar. This piece of code does not run the function on each entry of
n
:
n <- 1:25
compute_s_n(n)
Functionals are functions that help us apply the same function to each
entry in a vector, matrix, data frame, or list. Here we cover the
functional that operates on numeric, logical, and character vectors:
sapply
.
The function sapply
permits us to perform element-wise operations on
any function. Here is how it works:
x <- 1:10
sapply(x, sqrt)
#> [1] 1.00 1.41 1.73 2.00 2.24 2.45 2.65 2.83 3.00 3.16
Each element of x
is passed on to the function sqrt
and the result
is returned. These results are concatenated. In this case, the result is
a vector of the same length as the original x
. This implies that the
for-loop above can be written as follows:
n <- 1:25
s_n <- sapply(n, compute_s_n)
Other functionals are apply
, lapply
, tapply
, mapply
, vapply
,
and replicate
. We mostly use sapply
, apply
, and replicate
in
this book, but we recommend familiarizing yourselves with the others as
they can be very useful.