Aan de slagGa gratis aan de slag

Keukens verkennen: top-ingrediënten, vervolg

Elke keuken onderscheidt zich door een kleine set kenmerkende ingrediënten. Die zie je niet als je alleen naar de populairste ingrediënten kijkt, want dat zijn vaak basisproducten zoals zout of suiker.

Een andere maatstaf die hierbij helpt is de term frequency–inverse document frequency (TFIDF), een numerieke statistiek die aangeeft hoe belangrijk een woord (ingrediënt) is voor een document (keuken) binnen een verzameling of corpus (recepten).

We hebben de tf_idf al voor je voorgescoord en een verrijkte gegevensset gemaakt met de naam recipes_enriched. Jouw doel is om een Shiny-app te bouwen die een horizontale staafdiagram toont met de meest onderscheidende ingrediënten in een keuken, gemeten met tf_idf.

An app displaying an interactive horizontal bar plot of top ingredients by chosen cuisine

Je gebruikt een reactieve expressie om de berekeningen te kapselen, zodat de plot-code zich alleen hoeft te richten op het maken van de grafiek. Dit is goede programmeerpraktijk en helpt je Shiny-apps modulair en performant te maken.

We hebben de pakketten shiny, dplyr, ggplot2 en plotly geladen. Hier zijn twee handige snippets om te filteren op de top-ingrediënten per keuken en een horizontale staafdiagram te maken. Pas ze waar nodig aan.

top_ingredients <- recipes_enriched %>% 
  filter(cuisine == 'greek') %>% 
  arrange(desc(tf_idf)) %>% 
  head(5) 

ggplot(top_ingredients, aes(x = ingredient, y = tf_idf)) +
  geom_col() +
  coord_flip()

Deze oefening maakt deel uit van de cursus

Webapplicaties bouwen met Shiny in R

Cursus bekijken

Oefeninstructies

  • UI:

    • Voeg een interactieve plotly-output genaamd plot_top_ingredients toe en plaats die in een tabPanel() met een passend label.
  • Server:

    • Voeg een reactieve expressie toe met de naam rval_top_ingredients die recipes_enriched filtert op de gekozen keuken en de meest onderscheidende ingrediënten op basis van de tf_idf-waarde.
    • Render een interactieve staafdiagram van de top-ingrediënten en hun tf_idf en koppel die aan een output met de naam plot_top_ingredients. Extra uitdaging: zorg ervoor dat de staven in aflopende volgorde van tf_idf worden weergegeven.

Praktische interactieve oefening

Probeer deze oefening eens door deze voorbeeldcode in te vullen.

ui <- fluidPage(
  titlePanel('Explore Cuisines'),
  sidebarLayout(
    sidebarPanel(
      selectInput('cuisine', 'Select Cuisine', unique(recipes$cuisine)),
      sliderInput('nb_ingredients', 'Select No. of Ingredients', 1, 100, 10),
    ),
    mainPanel(
      tabsetPanel(
        # CODE BELOW: Add a plotly output named "plot_top_ingredients"
        
        tabPanel('Table', DT::DTOutput('dt_top_ingredients'))
      )
    )
  )
)

server <- function(input, output, session) {
  # CODE BELOW: Add a reactive expression named `rval_top_ingredients` that
  # filters `recipes_enriched` for the selected cuisine and top ingredients
  # based on the tf_idf value.

  
  
  
  
  
  
  # CODE BELOW: Render a horizontal bar plot of top ingredients and 
  # the tf_idf of recipes they get used in, and assign it to an output named 
  # `plot_top_ingredients` 
  
  
  
  
  
  output$dt_top_ingredients <- DT::renderDT({
    recipes %>% 
      filter(cuisine == input$cuisine) %>% 
      count(ingredient, name = 'nb_recipes') %>% 
      arrange(desc(nb_recipes)) %>% 
      head(input$nb_ingredients)
  })
}

shinyApp(ui, server)
Code bewerken en uitvoeren