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.

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
Oefeninstructies
UI:
- Voeg een interactieve plotly-output genaamd
plot_top_ingredientstoe en plaats die in eentabPanel()met een passend label.
- Voeg een interactieve plotly-output genaamd
Server:
- Voeg een reactieve expressie toe met de naam
rval_top_ingredientsdierecipes_enrichedfiltert op de gekozen keuken en de meest onderscheidende ingrediënten op basis van detf_idf-waarde. - Render een interactieve staafdiagram van de top-ingrediënten en hun
tf_idfen koppel die aan een output met de naamplot_top_ingredients. Extra uitdaging: zorg ervoor dat de staven in aflopende volgorde vantf_idfworden weergegeven.
- Voeg een reactieve expressie toe met de naam
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)