Activity-10

Sujith Prakash Parsa

2022-11-13

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"