# Pipes and functions in R ## Learning objectives * Demonstrate how to use the pipe * Demonstrate piping alternatives * Define functions and their purpose * Analyze a user-written function and explain how it works * Demonstrate conditional execution * Practice writing functions ## Notes **April 27, 2020** ## Pipes in R * Think back to the `diamonds` dataset * `filter()`, `group()`, and then `summarize()` ## Approaches to Coding ### Intermediate Steps * `diamonds_# <- function` * Unclear because the names are not intuitive * Might forget what the name of the object means * Make spelling mistakes * Might start running out of memory (not as common) * This works, but there are a couple of concerns when writing code this way **all the time** ### Overwrite the original ``` diamonds_t <- diamonds diamonds_t <- filter() ... ``` * If something goes wrong, you basically have to start over adn retrieve the original dataset ### Function Composition ``` summarize( group_by( filter(diamonds, color == "I"), cut ), price = mean(price) ) ``` * Now we're writing code in sort of a backwards manner * Again, **not very intuitive** > All of these approaches produce the **exact same output**, but we want to make sure that our code is **interpretable** and **reproducible**_ ### Piping * A lot more intuitive * Implicit * Remember: You don't assign `<-` something to an object inside the pipe operator * Depending on complexicity of task, you may have a lot of steps * Break piped operation into a smaller set of tasks and save output * Next line of code is **automaticaly indented** when you are using a piped operator * For all of the `tidyverse` functions we use the `%>%` at the end of a line. * `ggplot2` is different in that it uses a plus symbole `+` > The `%>%` comes from the `maggritr` package. There are [other piping operators](https://r4ds.had.co.nz/pipes.html#other-tools-from-magrittr) in the package, including the "tee" pipe `%T%` and `%<>%` ## Functions in R * Easy to use * Self-documenting * Easy-ier to debug * **If you have copied and pasted a block of code more than twice, convert it to a function** ### Rescale Function * Name * Arguments * Body ### How to use a function * When using functions, by default the returned object is merely printed to the screen ## Conditional execution ``` if (condition) { # code executed when condition is TRUE } else { # code executed when condition is FALSE } ``` * Recoding variables is where you would use `if()` statements * Need a **vectorized statement** check for multiple conditions * `if_else()` **FIZZBUZZ**