---
title: "PA 7: Writing Functions"
format: 
  html:
    code-tools: true
    toc: true
    embed-resources: true
editor: source
execute: 
  error: true
  echo: true
  message: false
  warning: false
---

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.

### Function 1

The person who has the most siblings will start as the Coder, the second most as the Project Manager.

**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.*

```{r}
nums <- 3:12
```



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

```{r}
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! *Hint*: You might decide to add a second (optional) argument to the `min()` function.

```{r}
test <- c(5:10, NA)

divide_and_round(test)
```

### Function 2

Swap roles!

**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.*

```{r}
nums <- 6:36
```

```{r}
# Write your code for Q4 here.
```

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

```{r}
# Write your code for Q5 here.
```

**6. Test your function by running the code below.**

```{r}
test <- c(seq(from = 15, to = 60, by = 5), NA)

no_nines_or_twelves(test)
```

### Function 3

Swap roles!

**7. Write code to manipulate the vector of numbers `nums`. Your code should determine which indices of the vector are even numbers using the modulo `%%`.**


**8. Use your code from Q7 to create 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.*

::: callout-warning
**Do not** use a `for()` loop to do this! Accomplish this with bracket indexing (`[]`) and modulus arithmetic (`%%`).
:::

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

    
  } else if(start == 1) {

    
  }
  
}
```

**9. Test your function by running the code below.**

```{r}
test <- c(1:10)

every_other(test)
every_other(test, start = 2)
```

### Function 4

Swap roles!

**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 of x is larger than 25.**

```{r}
nums <- 1:15
```



**11. Turn your code from Q10 into a function called `shorten()`. This function should take in a vector, drop all values BEFORE the cumulive sum is greater than the provided number, and return the remaining values from the original vector.**

::: callout-warning
**Do not** use a `while()` loop to do this! Accomplish this with the `cumsum()` function and bracketing.
:::

```{r}
# Write your code for Q9 here.
```


**12. Write code to test your function.**

```{r}
# Write code to test the shorten() function here.
```

### Unscramble the Numbers

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

```{r}
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)
# Should have 54 elements! 

my_vec <- divide_and_round(my_vec)

my_vec <- every_other(my_vec, 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)]
# Should have 6 elements! 

my_vec <- sort(my_vec)

my_vec
```

::: callout-tip
### 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.
:::
