Formation R

Shiny Réactivité

Reactive object: Syntaxe associée


  • Lors de la création de l’objet
  • reacObjectName <- reactive({ … })

  • Lors de l’appel de l’objet
  • reacObjectName()

Application mise en place

ui <- fluidPage(
  titlePanel('Tableau reactif'),
  sidebarLayout(
    sidebarPanel(
      selectInput('commune','lieu', unique(df_unemp$commune)),
      selectInput('variable', 'variable', unique(df_unemp$variable)),
      selectInput('year', 'année', unique(df_unemp$annee))
    ),
    mainPanel(
      reactableOutput('unemp')
    )
  )
)

server <- function(input, output, session){
  
  filtered_df <- reactive({
    res <- df_unemp
    conditions <-  map2(c('input$year', 'input$variable', 'input$commune'),
                        c('annee', 'variable', 'commune'),
                        filter_input_diff_all )
    
    eval(parse( text= conditions))
    res 
  })
  
  output$unemp <- renderReactable({
    reactable(filtered_df(),  filterable = FALSE)
  })
  
}

Ajout d’un actionButton

  • UI: actionButton() est ajouté
  • Server: observeEvent() ou eventReactive()

Ajout d’un actionButton

  • UI: actionButton() est ajouté
  • Server: observeEvent() ou eventReactive()

eventReactive

  • Créer un objet reactif déclanché à partir d’un autre

  • reacFunction <- eventReactive(                                                                                                     input$simulate, {…})
  • argument 1: élement déclencheur
  • argument 2: Calculs à effectuer

Instructions

  • Allez dans l’app Shiny
  • Ajouter dans l’ui l’actionButton()
  • Ajouter dans le server reactiveEvent

Code associé

ui <- fluidPage(
  titlePanel('Tableau reactif'),
  sidebarLayout(
    sidebarPanel(
      selectInput('commune','lieu', c('all',unique(df_unemp$commune))),
      selectInput('variable', 'variable', c('all',unique(df_unemp$variable))),
      selectInput('year', 'année', c('all',unique(df_unemp$annee))),
      actionButton('go','Run', class='btn-success')
    ),
    mainPanel(
      reactableOutput('unemp')
    )
  )
)

server <- function(input, output, session){
  
  filtered_df <- eventReactive(input$go,{
    res <- df_unemp
    
    conditions <-  map2(c('input$year', 'input$variable', 'input$commune'),
                        c('annee', 'variable', 'commune'),
                        filter_input_diff_all )
    
    eval(parse( text= conditions))
    res 
  })
  
  output$unemp <- renderReactable({
    reactable(filtered_df(),  filterable = FALSE)
  })
  
}

shinyApp(ui, server)

reactiveValues


  • Créer une list d’objets reactifs
  • Peuvent être mis à jour par la suite

  • values <- reactiveValues( a=mtcars,
                                                    b=10, c=TRUE)

observeEvent

  • Mettre à jours des objets reactifs déjà existants
  • Mettre en avant des effets neccessitant pas d’output:
  • sauvegarder, reinitialiser, update, envoie de données

  • observeEvent(input$simulate, {…})
  • fonctionne bien avec reactiveValues()

Instructions

  • Retourner dans l’application
  • Modifier la partie server
  • Ajouter reactiveValues et observeEvent()

Code associé

server <- function(input, output, session){
  
  
  val <- reactiveValues(data= df_unemp)
  
  observeEvent(input$run, {
    
    condition <- c(input$year, input$variable, input$commune)
    
    res <- df_unemp %>% 
      filter(annee== condition[1] & variable==condition[2] & commune==condition[3])
    
    val$data <- res
    
  })
  
  output$unemp <- renderReactable({
    reactable(val$data,  filterable = TRUE)
  })
  
}

Récapitulatif

Reactivité

  • reactive({...}): Rendre un élement reactif
  • reactiveValue(...): Créer un element reactif qui peut être modifié dans un autre objet
  • eventReactive(...,{...}): Créer un objet déclanché par un autre objet
  • observeEvent(...,{...}): Déclancher une action sur des élements déja existants

Questions?