CommencezCommencez gratuitement

Évitez de créer continuellement de nouveaux nuages de mots

L'application de nuage de mots comporte maintenant plusieurs entrées, et la modification de chacune d'elles entraîne le redessin du nuage de mots avec le nouvel ensemble de paramètres, comme prévu.

Mais ce comportement peut parfois être agaçant. Par exemple, lorsque vous saisissez du texte dans la zone de texte, le nuage de mots se régénère sans attendre que vous ayez terminé. Vous pouvez contrôler cela avec isolate().

Tout le code à l'intérieur de renderWordcloud2() qui générait le nuage de mots a été retiré. Votre tâche est de recréer le nuage de mots et de l'isoler afin que la modification des paramètres ne déclenche pas automatiquement un nouveau nuage de mots.

Cette activité fait partie du cours

Études de cas : créer des applications Web avec Shiny en R

Voir le cours

Instructions de l’exercice

  • Assurez-vous que toute la fonction qui génère le nuage de mots est isolée (ligne 54).
  • Fournissez les arguments à create_wordcloud() en utilisant les entrées et les variables réactives nécessaires. Les arguments de la fonction sont data, num_words et background (ligne 56).

Le résultat peut donner l'impression que l'application est brisée, car vous ne pourrez pas créer un nouveau nuage de mots, mais cela sera réglé dans un exercice ultérieur.

Exercice interactif pratique

Essayez cet exercice en complétant ce code d’exemple.

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)
Modifier et exécuter le code