Introduction

When Should you write a function?

# For reproductible work
set.seed(1234)


# Create a data frame
df <- tibble::tibble(
  a = rnorm(10),
  b = rnorm(10),
  c = rnorm(10),
  d = rnorm(10)
)
# Rescale each column

df$a <- (df$a - min(df$a, na.rm = TRUE)) /
  (max(df$a, na.rm = TRUE) - min(df$a, na.rm = TRUE))
df$b <- (df$b - min(df$b, na.rm = TRUE)) /
  (max(df$c, na.rm = TRUE) - min(df$c, na.rm = TRUE))
df$d <- (df$d - min(df$d, na.rm = TRUE))
(max(df$d, na.rm = TRUE) - min(df$d, na.rm = TRUE))
## [1] 3.282337
square <- function(var) {
  
  # body
  squared_value <- var * var
  
  # return value
  return(squared_value)
  
  
}

Functions are for Humans and Computers

Conditional execution

detect_sign <- function(x) {
  
  if(x > 0) {
    message ("Value is positive")
    print(x)
  } else if (x == 0) {
    warning("Value is not positive, but it can be accepted")
    print(x)
  } else {
  stop("Value is negative, the function must stop")
    print(x)
  }

}
3 %>% detect_sign()
## Value is positive
## [1] 3
0 %>% detect_sign()
## Warning in detect_sign(.): Value is not positive, but it can be accepted
## [1] 0
#-1 %>% detect_sign()

Function Arguments

?mean

x <- c(1:10, 100, NA)
x
##  [1]   1   2   3   4   5   6   7   8   9  10 100  NA
x %>% mean ()
## [1] NA
x %>% mean (na.rm = TRUE)
## [1] 14.09091
x %>% mean (na.rm = TRUE, trim = 0.1)
## [1] 6
mean_remove_na <- function (x, na.rm = TRUE, ...) {
  
  avg <- mean(x, na.rm = na.rm, ...)
  
  return(avg)
  
}

x %>% mean_remove_na()
## [1] 14.09091
x %>% mean_remove_na(na.rm = FALSE)
## [1] NA
x %>% mean_remove_na(trim = 0.01)
## [1] 14.09091

Return values