Zacznij terazZacznij za darmo

Zatrzymaj ciągłe generowanie nowych chmur słów

Aplikacja z chmurą słów ma teraz kilka różnych pól wejściowych. Zmiana każdego z nich powoduje przerysowanie chmury słów z nowym zestawem parametrów – dokładnie tak, jak powinno to działać.

Czasami jednak takie zachowanie może być uciążliwe. Na przykład podczas wpisywania tekstu w polu tekstowym chmura słów bez przerwy się odświeża, nie czekając na zakończenie pisania. Można to kontrolować za pomocą funkcji isolate().

Cały kod wewnątrz renderWordcloud2(), który renderuje chmurę słów, został usunięty. Twoim zadaniem jest odtworzenie chmury słów i wyizolowanie jej tak, aby zmiana parametrów nie wywoływała automatycznie nowej chmury słów.

To ćwiczenie jest częścią kursu

Studia przypadków: tworzenie aplikacji webowych w Shiny w R

Zobacz kurs

Instrukcje do ćwiczenia

  • Upewnij się, że cała funkcja generująca chmurę słów jest wyizolowana (linia 54).
  • Przekaż argumenty do create_wordcloud(), korzystając z odpowiednich pól wejściowych i zmiennych reaktywnych. Argumenty funkcji to data, num_words i background (linia 56).

Efekt tych zmian może sprawiać wrażenie, że aplikacja przestała działać, ponieważ nie będziesz w stanie wygenerować nowej chmury słów – jednak zostanie to rozwiązane w kolejnym ćwiczeniu.

Interaktywne ćwiczenie praktyczne

Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.

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)
Edytuj i uruchom kod