PA 7: Writing Functions

Download starter .qmd template

You will write several small functions, then use them to unscramble a message. Many of the functions have been started for you below, but none of them are complete as is.

1. Write code to manipulate the vector of numbers nums. Your code should divide each element in the vector by the smallest element and round the results to the nearest whole number. This code should not be a function.

nums <- 3:12

2. Turn your code from Q1 into a function called divide_and_round(). Fill in the skeleton below.

divide_and_round <- function(vec){
  
}

3. Test your function by running the code below. If you don’t get what you expect - edit your function!

test <- c(5:10, NA)
divide_and_round(test)
NULL

4. Write code to manipulate the vector of numbers nums. Your code should, for each element, return TRUE if the number is NOT divisible by 9 or 12, and return FALSE otherwise. This code should not be a function.

# Write your code for Q4 here.

5. Turn your code from Q4 into a function called no_nines_or_twelves().

# Write your code for Q5 here.

6. Test your function by running the code below.

test <- c(3:12*5, NA)
no_nines_or_twelves(test)
Error in no_nines_or_twelves(test): could not find function "no_nines_or_twelves"

7. Write a function called every_other(). This function should take in a vector and return every other value in the vector. Include an optional argument called start which lets you choose where to start skipping; that is, if start = 1, the function returns the 1st, 3rd, 5th, etc. values and if start = 2, the function returns the 2nd, 4th, 6th, etc. values. Fill in the skeleton below.

Warning

Do not use a for() loop to do this! Accomplish this with bracket indexing ([]) and modulus arithmetic (%%).

every_other <- function(vec){
  
  if(start == 2){

    
  } else if(start == 1) {

    
  }
  
}

8. Test your function by running the code below.

test <- c(1:10)

every_other(test)
Error in start == 2: comparison (==) is possible only for atomic and list types
every_other(test, start = 2)
Error in every_other(test, start = 2): unused argument (start = 2)

9. Write a function called shorten(). This function should take in a vector, and only return values from the original vector for which the cumulative sum for that element is greater than a provided number.

Warning

Do not use a while() loop to do this! Accomplish this with the cumsum() function and bracketing.

# Write your code for Q9 here.

10. Write code to test your function.

# Write code to test the shorten() function here.

11. Once you have written your four functions correctly, run the following code:

my_vec <- c(39, 1.87, 48, 11, 8, 45, 21, 5, 12, 33, 9, 11, 108,
            4, 18, 5, 16, 17, 8, 48, 27, 24, 4, 22, 12, 27, 23,
            46, 42, 35, 15, 34, 36, 26, 18, 10, 18.21, 72.04,
            36.9, 41.81, 29, 89.75, 34.03, 20.18, 48.74, 15.76,
            31.86, 83.6, 43.55, 39.99, 23.55, 8.54, 24.71, 22.02,
            9.71, 62.14, 35.46, 16.61, 15.66, 21.29, 30.52,
            201.07, 45.81, 7.85, 30.13, 34.14, 22.62, 10.2, 6.02,
            30.12, 10.64, 31.72, 24.57, 14.43, 43.37, 89.93,
            44.72, 51.32, 13.62, 45.56, 22.96, 7.05, 29.99, 41.38,
            26.59, 23.04, 19.82, 50.73, 39.56, 43.79, 30.22, 85.85,
            5.78, 78.85, 29.52, 66.27, 44.06, 27.28, 24.43, 64.32,
            3.35, 67.45, 46.72, 48.44, 48.65, 33.3, 40.28, 19.04)

my_vec <- every_other(my_vec, start = 2)
Error in every_other(my_vec, start = 2): unused argument (start = 2)
# Should have 54 elements! 

my_vec <- divide_and_round(my_vec)

my_vec <- every_other(my_vec, start = 1)
Error in every_other(my_vec, start = 1): unused argument (start = 1)
# Should have 27 elements!

my_vec <- shorten(my_vec, 350)
Error in shorten(my_vec, 350): could not find function "shorten"
# Should have 12 elements!

my_vec <- my_vec[no_nines_or_twelves(my_vec)]
Error in no_nines_or_twelves(my_vec): could not find function "no_nines_or_twelves"
# Should have 6 elements! 

my_vec <- sort(my_vec)

my_vec
NULL
Canvas Submission

If you have done everything correctly, your final vector will be six numbers long. Google these six numbers to find a TV show as your final answer and submit to Canvas.