# Load packages

# Core
library(tidyverse)
library(tidyquant)
library(scales)

Ch19 Functions

When Should You Write a Function?

# For Reproducible 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$b, na.rm = TRUE) - min(df$b, na.rm = TRUE))
df$c <- (df$c - min(df$c, 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))
recsale <- function(x) {
    
    # Body 
    x <- (x - min(x, na.rm = TRUE)) / 
  (max(x, na.rm = TRUE) - min(x, na.rm = TRUE))
    
    # Return Values 
    return(x)
}
df$a <- rescale(df$a)
df$b <- rescale(df$b)
df$c <- rescale(df$c)
df$d <- rescale(df$d)


df
## # A tibble: 10 × 4
##        a      b     c     d
##    <dbl>  <dbl> <dbl> <dbl>
##  1 0.332 0.153  0.782 1    
##  2 0.765 0      0.473 0.519
##  3 1     0.0651 0.498 0.448
##  4 0     0.311  0.943 0.511
##  5 0.809 0.573  0.373 0.168
##  6 0.831 0.260  0     0.308
##  7 0.516 0.143  1     0    
##  8 0.524 0.0255 0.210 0.256
##  9 0.519 0.0472 0.708 0.575
## 10 0.424 1      0.253 0.522

Functions are for Humans and Computers

Name the function as short as possible. Also, make sure that the function is clear and makes sense. This makes typing for functions easier. Do not overwrite existing functions, if you are writing a function use the preexisting one. This section is basically talking about how to make life easier when it comes to functions and coding.

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()
## [1] 3
0 %>% detect_sign()
## [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.1)
## [1] 6

Two Types of Functions: