Aan de slagBegin gratis

Maak niet continu nieuwe word clouds

De word cloud-app heeft nu meerdere invoerelementen, en het aanpassen van elk daarvan zorgt ervoor dat de word cloud opnieuw wordt getekend met de nieuwe parameters, precies zoals verwacht.

Maar dit gedrag kan soms ook vervelend zijn. Bijvoorbeeld: terwijl je tekst typt in het tekstvak, blijft de word cloud zich opnieuw genereren zonder te wachten tot je klaar bent met typen. Dit kun je regelen met isolate().

Alle code binnen renderWordcloud2() die de word cloud rendert, is verwijderd. Jouw taak is om de word cloud opnieuw te maken en te isoleren, zodat het wijzigen van de parameters niet automatisch een nieuwe word cloud triggert.

Deze oefening maakt deel uit van de cursus

Casestudies: webapplicaties bouwen met Shiny in R

Bekijk cursus

Oefeninstructies

  • Zorg dat de volledige functie die de word cloud genereert geïsoleerd is (regel 54).
  • Geef de argumenten door aan create_wordcloud() met de juiste inputs en reactieve variabelen. De argumenten voor de functie zijn data, num_words en background (regel 56).

Het resultaat hiervan kan lijken alsof de app kapot is, omdat je geen nieuwe word cloud kunt maken, maar dat lossen we op in een volgende oefening.

Interactieve oefening met praktijkervaring

Probeer deze oefening door deze voorbeeldcode aan te vullen.

ui <- fluidPage(
  h1("Word Cloud"),
  sidebarLayout(
    sidebarPanel(
      radioButtons(
        inputId = "source",
        label = "Word source",
        choices = c(
          "Art of War" = "book",
          "Use your own words" = "own",
          "Upload a file" = "file"
        )
      ),
      conditionalPanel(
        condition = "input.source == 'own'",
        textAreaInput("text", "Enter text", rows = 7)
      ),
      conditionalPanel(
        condition = "input.source == 'file'",
        fileInput("file", "Select a file")
      ),
      numericInput("num", "Maximum number of words",
                   value = 100, min = 5),
      colourInput("col", "Background color", value = "white")
    ),
    mainPanel(
      wordcloud2Output("cloud")
    )
  )
)

server <- function(input, output) {
  data_source <- reactive({
    if (input$source == "book") {
      data <- artofwar
    } else if (input$source == "own") {
      data <- input$text
    } else if (input$source == "file") {
      data <- input_file()
    }
    return(data)
  })
  
  input_file <- reactive({
    if (is.null(input$file)) {
      return("")
    }
    readLines(input$file$datapath)
  })
  
  output$cloud <- renderWordcloud2({
    # Isolate the code to render the word cloud so that it will
    # not automatically re-render on every parameter change
    ___({
      # Render the word cloud using inputs and reactives
      create_wordcloud(data = ___, num_words = ___,
                       background = ___)
    })
  })
}

shinyApp(ui = ui, server = server)
Code bewerken en uitvoeren