nums <- 3:12PA 7: Writing Functions
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.
This task is complex. It requires many different types of abilities. Everyone will be good at some of these abilities but nobody will be good at all of them. In order to produce the best product possible, you will need to use the skills of each member of your group.
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. Hint: This code should not be a function.
2. Turn your code from Q1 into a function called divide_and_round(). Fill in the skeleton code below.
divide_and_round <- function(vec){
}3. Test your function by running the code below.
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. Hint: This code should not be a function.
5. Turn your code from Q4 into a function called no_nines_or_twelves().
6. Test your function by running the code below.
test <- c(seq(from = 15, to = 60, by = 5),
NA)
no_nines_or_twelves(test)Error in no_nines_or_twelves(test): could not find function "no_nines_or_twelves"
7. Write code to manipulate the vector of numbers nums. Your code should generate the sequence of indices of nums using seq_along(). You should then determine which indices are even numbers using %%.
nums <- 9:188. Turn you code from Q7 into a function called every_other(). This function should take in a vector and return every other value in the vector. The function should 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.
every_other <- function(vec){
if(start == 2){
vec[]
} else if(start == 1) {
vec[]
}
}9. Test your function by running the code below.
test <- 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)
10. Write code to manipulate the vector of numbers nums. Your code should, compute the running total at each position using the cumsum() function, and check where the cumulative sum is larger than 25.
nums <- 1:1511. Turn your code from Q10 into a function called shorten(). The function should take in a vector, drop all values BEFORE the cumulative sum is greater than a provided number, and return the remaining values from the original vector.
shorten <- function(vec, sum){
# Calculate the cumulative sum
# Find the indices that exceed the limit
# Keep indices from first exceedance onward
}12. Test your function by running the code below.
test <- 20:50
shorten(test, 350)NULL
13. 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)
# 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_vecNULL
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.