Kom igångKom igång gratis

Skapa inte nya ordmoln i onödan

Ordmolnsappen har nu flera olika indata, och när du ändrar något av dem ritas ordmolnet om med de nya parametrarna – precis som förväntat.

Detta beteende kan dock vara störande ibland. Till exempel: när du skriver i textfältet genereras ordmolnet om gång på gång, utan att vänta på att du ska bli klar. Det kan styras med isolate().

All kod inuti renderWordcloud2() som ritar ordmolnet har tagits bort. Din uppgift är att återskapa ordmolnet och isolera det, så att ändringar i parametrarna inte automatiskt utlöser ett nytt ordmoln.

Den här övningen är en del av kursen

Fallstudier: Bygg webbapplikationer med Shiny i R

Visa kurs

Övningsinstruktioner

  • Se till att hela funktionen som genererar ordmolnet är isolerad (rad 54).
  • Ange argumenten till create_wordcloud() med hjälp av nödvändiga indata och reaktiva variabler. Funktionens argument är data, num_words och background (rad 56).

Resultatet kan verka som att appen har slutat fungera, eftersom du inte kan skapa ett nytt ordmoln – men det åtgärdas i en kommande övning.

Interaktiv övning med praktiskt arbete

Testa den här övningen genom att slutföra den här exempelkoden.

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)
Redigera och kör kod