class: center, middle, inverse, title-slide # Advanced R ## Chapter 5 ### R4DS Reading Group --- # CONTROL FLOW - `if` - `ifelse` - `case_when` - `switch` - `for` - `while` - `repeat` --- # But First... BEER! - State (abbreviated) - Year - Barrels (barrels produced) - Type (On premise, Bottles/Cans, Kegs/Barrels) <table> <thead> <tr> <th style="text-align:left;"> state </th> <th style="text-align:right;"> year </th> <th style="text-align:right;"> barrels </th> <th style="text-align:left;"> type </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> AK </td> <td style="text-align:right;"> 2008 </td> <td style="text-align:right;"> 2067.69 </td> <td style="text-align:left;"> On Premises </td> </tr> <tr> <td style="text-align:left;"> AK </td> <td style="text-align:right;"> 2009 </td> <td style="text-align:right;"> 2263.65 </td> <td style="text-align:left;"> On Premises </td> </tr> <tr> <td style="text-align:left;"> AK </td> <td style="text-align:right;"> 2010 </td> <td style="text-align:right;"> 1929.15 </td> <td style="text-align:left;"> On Premises </td> </tr> <tr> <td style="text-align:left;"> AK </td> <td style="text-align:right;"> 2011 </td> <td style="text-align:right;"> 2251.02 </td> <td style="text-align:left;"> On Premises </td> </tr> <tr> <td style="text-align:left;"> AK </td> <td style="text-align:right;"> 2012 </td> <td style="text-align:right;"> 2312.43 </td> <td style="text-align:left;"> On Premises </td> </tr> <tr> <td style="text-align:left;"> AK </td> <td style="text-align:right;"> 2013 </td> <td style="text-align:right;"> 2155.60 </td> <td style="text-align:left;"> On Premises </td> </tr> </tbody> </table> --- # If and ifelse *Let's see if a random state in our dataset is my home town, NV* ##### IF ```r if (sample(beer_states$state, 1) == "NV") print("My Home State") ``` ##### IF ELSE ```r if (sample(beer_states$state, 1) == "NV") print("My Home State") else print("Not my home") ``` ``` ## [1] "Not my home" ``` ##### IFELSE ```r ifelse((sample(beer_states$state, 1) == "NV"), print("My Home State"), print("Not my home")) ``` ``` ## [1] "Not my home" ``` ``` ## [1] "Not my home" ``` .footnote[ *Why does the `ifelse` statement print "Not my home" twice?* ] --- # CASE WHEN *Let's change the barrels column to categorical* .pull-left[ ```r beer_states %>% mutate( barrel_cat = if (barrels >= 100000000) { "A lot" } else if (barrels >= 10000000) { "Many" } else if (barrels >= 1000000) { "A few" } else { "Not much" } ) ``` ] .pull-right[ ```r beer_states %>% mutate( barrel_cat = case_when( barrels >= 100000000 ~ "A LOT!", barrels >= 10000000 ~ "Many", barrels >= 1000000 ~ "A few", TRUE ~ "Not much" ) ) ``` ] <table> <thead> <tr> <th style="text-align:left;"> barrel_cat </th> <th style="text-align:right;"> n </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> A LOT! </td> <td style="text-align:right;"> 12 </td> </tr> <tr> <td style="text-align:left;"> Many </td> <td style="text-align:right;"> 98 </td> </tr> <tr> <td style="text-align:left;"> Not much </td> <td style="text-align:right;"> 1569 </td> </tr> <tr> <td style="text-align:left;"> A few </td> <td style="text-align:right;"> 193 </td> </tr> </tbody> </table> --- # SWITCH *Let's make a small shiny app to see the number of barrels per state* .shinyapp[ .pull-left[ ```r library(shiny) library(tidyverse) brewing_materials <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-03-31/brewing_materials.csv') beer_taxed <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-03-31/beer_taxed.csv') brewer_size <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-03-31/brewer_size.csv') beer_states <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-03-31/beer_states.csv') ui <- fluidPage( sidebarLayout( sidebarPanel( selectInput(inputId = "dataset", label = "Choose a dataset:", choices = c("materials", "size", "states", "taxed")) ), mainPanel( verbatimTextOutput("summary") ) ) ) server <- function(input, output) { datasetInput <- reactive({ * switch(input$dataset, * "materials" = brewing_materials, * "size" = brewer_size, * "states" = beer_states, * "taxed" = beer_taxed) }) output$summary <- renderPrint({ dataset <- datasetInput() summary(dataset) }) } shinyApp(ui = ui, server = server) ``` ]] .pull-right[ ![](switch_app.png)<!-- --> ] .footer[ ```r runApp("Presentations/Week5/switch_app/app.R", display.mode = "showcase") ``` ] --- # FOR *Create a "region" column based on each observatation's state* .smaller-pre[ .pull-left[ ```r *for (i in 1:nrow(beer_states)) { if (beer_states$state[i] %in% Region1) { beer_states$region[i] <- "Region 1" } else if (beer_states$state[i] %in% Region2) { beer_states$region[i] <- "Region 2" } else if (beer_states$state[i] %in% Region3) { beer_states$region[i] <- "Region 3" } else if (beer_states$state[i] %in% Region4) { beer_states$region[i] <- "Region 4" } else if (beer_states$state[i] %in% Region5) { beer_states$region[i] <- "Region 5" } else if (beer_states$state[i] %in% Region6) { beer_states$region[i] <- "Region 6" } else if (beer_states$state[i] %in% Region7) { beer_states$region[i] <- "Region 7" } else if (beer_states$state[i] %in% Region8) { beer_states$region[i] <- "Region 8" } else if (beer_states$state[i] %in% Region9) { beer_states$region[i] <- "Region 9" } else if (beer_states$state[i] %in% Region10) { beer_states$region[i] <- "Region 10" } else { beer_states$region[i] <- "Missing" } *} ``` ]] .pull-right[ ![](regions.png)<!-- --> ] --- # WHILE .smaller-pre[ .pull-left[ ```r library(shiny) beer_states <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-03-31/beer_states.csv') ui <- fluidPage( sidebarPanel(numericInput('xqty', 'Number of States', 3, 1, 10)), mainPanel(tableOutput("while_debug"))) server <- function(input, output, session) { states <- unique(beer_states$state) * my_vector <- reactive({ * i <- 0 * my_vector <- vector() * while (i <= input$xqty) { * my_vector[i] <- i * i = i+1 * } * return(my_vector) * }) output$while_debug <- renderTable({ beer_states %>% filter(state %in% unique(beer_states$state)[my_vector()]) %>% filter(state != "total") %>% group_by(state) %>% summarise(num_barrels = sum(barrels)) }) } shinyApp(ui = ui, server = server) ``` ]] .pull-right[ ![](while_app.png)<!-- --> ] --- # REPEAT *Let's revist beer in Nevada - rather than take one sample, we can use repeat to continue sampling until we find beer!* ```r repeat { if (sample(beer_states$state, 1) == "NV") { print("Go grab a beer!"); break } else print("Maya doesn't live here"); } ``` ``` [1] "Maya doesn't live here" [1] "Maya doesn't live here" [1] "Maya doesn't live here" [1] "Maya doesn't live here" [1] "Maya doesn't live here" [1] "Maya doesn't live here" [1] "Maya doesn't live here" [1] "Maya doesn't live here" [1] "Maya doesn't live here" [1] "Maya doesn't live here" [1] "Maya doesn't live here" [1] "Maya doesn't live here" [1] "Maya doesn't live here" [1] "Maya doesn't live here" [1] "Maya doesn't live here" [1] "Go grab a beer!" ``` --- # ALL TOGETHER! *This diagram is incomplete - let's improve it together!* ![](controlflow.png)<!-- --> <style> pre { font-size: 0.7em; } .footnote { position: fixed; bottom: 0; right: 0; } .shinyapp { font-size: 0.5em; } .smaller-pre { font-size: 0.9em; } .remark-code-line-highlighted { background-color: rgba(48,146,255,0.2); } </style>