<- 3:12 nums
PA 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.
<- function(vec){
divide_and_round
}
3. Test your function by running the code below.
<- c(5:10, NA)
test 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.
<- c(seq(from = 15, to = 60, by = 5),
test 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.
Hint: Do not use a for()
loop to do this! Accomplish this with the seq_along()
function, bracket subsetting ([]
), and modulus arithmetic (%%
).
<- function(vec){
every_other
if(start == 2){
vec[]else if(start == 1) {
}
vec[]
}
}
8. Test your function by running the code below.
<- c(1:10)
test
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, drop all values BEFORE the cumulative sum is greater than a provided number, and return the remaining values from the original vector.
Hint: Do not use a while()
loop to do this! Accomplish this with the cumsum()
function and bracketing.
<- function(x, sum){
shorten
}
10. Test your function by running the code below.
<- 20:50
test shorten(test, 350)
NULL
11. Once you have written your four functions correctly, run the following code:
<- c(39, 1.87, 48, 11, 8, 45, 21, 5, 12, 33, 9, 11, 108,
my_vec 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)
<- every_other(my_vec, start = 2) my_vec
Error in every_other(my_vec, start = 2): unused argument (start = 2)
# Should have 54 elements!
<- divide_and_round(my_vec)
my_vec
<- every_other(my_vec, start = 1) my_vec
Error in every_other(my_vec, start = 1): unused argument (start = 1)
# Should have 27 elements!
<- shorten(my_vec, 350)
my_vec # Should have 12 elements!
<- my_vec[no_nines_or_twelves(my_vec)] my_vec
Error in no_nines_or_twelves(my_vec): could not find function "no_nines_or_twelves"
# Should have 6 elements!
<- sort(my_vec)
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.