Loading the required packages
library(tidyverse)
library(stringr)# Creating a function called mySum with 2 required arguments
mySum <- function(number1, number2) {
return(number1 + number2)
}
# Defaulting to order of arguments in function
mySum(5, 3)## [1] 8
# Manually specifying arguments
mySum(number1 = 5, number2 = 3)## [1] 8
mySum(13, 1989)## [1] 2002
mySum(NA, 1989)## [1] NA
mySum( ) of 13, 1989 gives the result 2002.
mySum( ) of NA, 1989 gives the result NA.
# Creating a function called mySum with 2 required arguments, 1 optional argument
myNewSum <- function(number1, number2, remove.na = TRUE) {
if(remove.na) {
# Replaces the NA with 0 if NA is an argument
calcSum <- ifelse(is.na(number1), 0, number1) +
ifelse(is.na(number2), 0, number2)
} else {
# calculates the sum if no NA is present
calcSum <- number1 + number2
}
return(calcSum)
}You Try - 2
# Create function that checks if a string starts with a given prefix
startsWith <- function(string, prefix) {
str_sub(string, 1, nchar(prefix)) == prefix
}
# Create a function to drop the last entry of a vector
dropLast <- function(x) {
if (length(x) <= 1) return(NULL)
x[-length(x)]
}
# create a function to calculate the harmonic mean
harmonicMean <- function(x) {
1 / (mean(1 / x))
}
harmonicMean(1:50)## [1] 11.11307
# create a function to calculate the geometric mean
geometricMean <- function(values) {
myProduct <- prod(values)
n <- length(values)
return(myProduct^(1 / n))
}
geometricMean <- function(values){
return(exp(mean(log(values))))
}
geometricMean(1:50)## [1] 19.48325
harmonicMean(1:50)## [1] 11.11307
mean(1:50)## [1] 25.5
Conditional execution, warnings, and errors
# Function to calculate square root
calcSqrt <- function(val) {
if (val >= 0) {
return(val^0.5)
} else {
warning("val is negative but must be >= 0!")
return(NaN)
}
}
calcSqrt(4)## [1] 2
calcSqrt(-9)## [1] NaN
Chained if else statements
foodType <- function(food) {
if (food %in% c("apple", "orange", "banana")) {
return("fruit")
} else if(food %in% c("broccoli", "asparagus")) {
return("vegetable")
} else {
return("other")
}}
foodType("Reese's Puffs")## [1] "other"
foodType("apple")## [1] "fruit"
is_whole_number <- function(number){
if(floor(number) == number & number >= 0){
return(TRUE)
}
else{
return(FALSE)
}
}
is_whole_number(0)## [1] TRUE
is_whole_number(-2)## [1] FALSE
is_whole_number(pi)## [1] FALSE
#The ^ operator raises a number to a specified power in R. Create a function that raises a number to a specified power, and returns a warning and an NaN value if the number is negative and the power is not a whole number.
raise_power <- function(number, power){
if(number < 0 & !(is_whole_number(power))){
warning("Hey !! That number is negative and the power is not a whole number...")
return(NaN)
}
else{
return(number^power)
}
}
raise_power(4, -2)## [1] 0.0625
raise_power(-9, 2)## [1] 81
raise_power(3, 1/3)## [1] 1.44225
raise_power(-3, 1/3)## [1] NaN
Using ifelse() function
# Creating a function called mySum with 2 required arguments, 1 optional argument
myNewSum <- function(number1, number2, remove.na = TRUE) {
if(remove.na) {
calcSum <- ifelse(is.na(number1), 0, number1) +
ifelse(is.na(number2), 0, number2)
} else {
calcSum <- number1 + number2
}
return(calcSum)
}
myNewSum(13, 1989)## [1] 2002
myNewSum(NA, 1989)## [1] 1989
any_negative <- function(numbers){
return(any(numbers < 0))
}
any_negative(c(-5, 0, 1, 2))## [1] TRUE
Does the code (1:4 < 4) & (1:4 > 1) produce the same result as (1:4 < 4) && (1:4 > 1)? Which code achieves what appears to be its intended purpose?
(1:4 < 4) & (1:4 > 1)## [1] FALSE TRUE TRUE FALSE
(1:4 < 4) && (1:4 > 1)## [1] FALSE
(1:4 < 4) & (1:4 > 1) this returns an array of boolean values
(1:4 < 4) && (1:4 > 1) this returns a single boolean value
Bonus
Write a function to check if a number is even or odd that returns a vector containing the values “even”, “odd”, or “not an integer” depending on its input.
checkNumber <- function(number){
if(!(floor(number) == number)){
return("not an integer")
}
if(number %% 2 == 0){
return("even")
}
else{
return("odd")
}
}
checkNumber(-3.5)## [1] "not an integer"
checkNumber(4)## [1] "even"
checkNumber(3)## [1] "odd"