Functions
Sometimes the operations that we want to perform are not built-in in R. In this case, we might consider creating our own functions.
A function is a map from a set of values (in the preimage) to another set of values (in the image) by a certain rule. Inputs of the function can be any type of object (eg. number, string, vector, etc.), and so are the outputs.
3.6 A Basic Example
Suppose we want to create a function that takes three numbers as inputs and returns their sum. Let’s call this the “summation” function.
## [1] 6
In the parenthesis, specifies the input variables. The last part tells R what the outputs are.
3.7 Functions with control flows
We can also incorporate control flows and other logical structures into a function. Now we want to create a function that ranks 3 numbers, from smallest to largest:
rank <- function(x, y, z) {
if (x < y) {
if (y < z) {
a <- c(x, y, z)
} else {
if (x < z) {
a <- c(x, z, y)
} else {
a <- c(z, x, y)
}
}
} else {
if (x < z) {
a <- c(y, x, z)
} else {
if (y < z) {
a <- c(y, z, x)
} else {
a <- c(z, y, x)
}
}
}
a
}
rank(x = 1, y = 10, z = 5)
## [1] 1 5 10
3.8 Logical/String as inputs
Functions can also take inputs of logical statements (i.e. TRUE or FALSE) and strings. The following example is a function that performs one of the following operations between two objects up to user’s choice: addition, multiplication, and division.
3.9 Multiple outputs as a list
Suppose we want to create a function that takes an input vector of observations and returns both the mean and the standard deviation. We can put the outputs in a list.
central_tendency <- function(x) {
m = mean(x)
s = sd(x)
results <- list(average = m,
standard_deviation = s)
results
}
my_vec <- 1:100
central_tendency(my_vec)
To refer to part of the output, use the ‘$’ sign:
3.10 Your turn
- Suppose you want to create a function named
variance
that computes the variance (\(S^2\)) of a set of observationsx
, either correcting for the bias \((n-1)\) or not \((n)\) up to the user’s choice. The default uses the corrected variance \(SS / (n-1)\).
hints:
The function should have two arguments (
x
,correct
).The sample size
n
can be obtained bylength(x)
.Write an
if/else
statement inside the function.- If the argument
correct == TRUE
, compute the variance by \(S^2_X = \frac{\sum_{i=1}^{n}{(X-\bar{X})^2}}{n-1}\), or else, \(S^2_X=\frac{\sum_{i=1}^{n}{(X-\bar{X})^2}} {n}\).
- If the argument
You can compute the sum of squares \(SS = \sum_{i=1}^{n}(X-\bar{X})^2\) by: