Variables réactives

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

Dean Attali

Shiny Consultant

Duplication de code

data <- gapminder
data <- subset(
    data,
    lifeExp >= input$life[1] & lifeExp <= input$life[2]
)
if (input$continent != "All") {
    data <- subset(
        data,
        continent == input$continent
   )
}
  • Dupliqué 3 fois
    1. renderTable()
    2. renderPlot()
    3. downloadHandler()
Études de cas : créer des applications Web avec Shiny en R

Les variables réactives réduisent la duplication

  • Code dupliqué ⇒ plusieurs endroits à maintenir
    • Quand il faut mettre à jour le code
    • Quand il faut corriger des bogues
  • Facile d'en oublier un et créer des bogues
  • Utilisez des variables reactive() au lieu de dupliquer le code
Études de cas : créer des applications Web avec Shiny en R

Variables réactives

output$my_table <- renderTable({
    data <- gapminder
    data <- subset(
        data,
        lifeExp >= input$life[1] & lifeExp <= input$life[2]
    )
})
my_data <- reactive({

data <- gapminder data <- subset( data, lifeExp >= input$life[1] & lifeExp <= input$life[2] )
})
output$my_table <- renderTable({ my_data() })
Études de cas : créer des applications Web avec Shiny en R

Mise en cache des variables réactives

  • Les variables réactives mettent en cache leur valeur
  • Elles mémorisent leur propre valeur
  • Ne s'exécutent pas si les dépendances n'ont pas changé
Études de cas : créer des applications Web avec Shiny en R

Mise en cache des variables réactives

  output$table <- renderTable({
      fit_model(input$num)
  })

  output$plot <- renderPlot({
      ggplot(
        fit_model(input$num), ...)
  })
  • fit_model() prend 5 s
  • fit_model() appelé deux fois = 10 s
x <- reactive({
    fit_model(input$num)
})

output$table <- renderTable({ x() })
output$plot <- renderPlot({ ggplot(x(), ...) })
  • x() appelé deux fois, le code interne ne s'exécute qu'une fois
  • fit_model() appelé une fois = 5 s
Études de cas : créer des applications Web avec Shiny en R

Les variables réactives sont paresseuses

  • Variable paresseuse = non calculée tant que la valeur n'est pas requise

    x <- reactive({
        fit_model(input$num)
    })
    
    output$download <- downloadHandler(
        filename = "x.csv",
        content = function(file) {
            write.csv(x(), file)
        }
    )
    
  • x() ne s'exécute qu'au moment du téléchargement, pas à chaque changement de input$num

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

Passons à la pratique !

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

Preparing Video For Download...