Brillant: Quelle est la différence entre un événement observéet un événement réactif?

j'ai lu la documentation brillante sur la programmation réactive à quelques reprises maintenant, mais je ne peux pas bien comprendre la différence entre observeEvent et eventReactive.

La documentation dit:

utilisez observeEvent chaque fois que vous voulez effectuer une action en réponse à un événement. (Notez que "recalculer une valeur" ne compte généralement pas comme effectuer une action–voir eventReactive pour cela.)

....

utiliser eventReactive to créez une valeur calculée qui ne se met à jour qu'en réponse à un événement. C'est comme une expression réactive normale sauf qu'elle ignore toutes les invalidations habituelles qui proviennent de ses dépendances réactives;

dans toute la situation j'ai essayé je n'ai vu aucune différence entre l'utilisation observeEvent et eventReactive (le code fonctionne très bien quelle que soit la fonction que j'utilise, sans impact apparent sur les performances).

Pouvez-vous m'aider à comprendre quelle est la réelle différence entre les deux? Idéalement, je voudrais quelques exemples montrant quand ils sont interchangeables, un quand observeEvent mais pas eventReactive et vice versa.

38
demandé sur lucacerone 2015-11-04 13:45:49

4 réponses

comme le dit @daatali, les deux fonctions sont utilisées à des fins différentes.

ui <- shinyUI(pageWithSidebar(
  headerPanel("eventReactive and observeEvent"),
  sidebarPanel(
    actionButton("evReactiveButton", "eventReactive"),
    br(),
    actionButton("obsEventButton", "observeEvent"),
    br(),
    actionButton("evReactiveButton2", "eventReactive2")
  ),
  mainPanel(
    verbatimTextOutput("eText"),
    verbatimTextOutput("oText")
  )
))

server <- shinyServer(function(input, output) {
  etext <- eventReactive(input$evReactiveButton, {
    runif(1)
  })
  observeEvent(input$obsEventButton,{
    output$oText <- renderText({ runif(1) })
  })
  eventReactive(input$evReactiveButton2,{
    print("Will not print")
    output$oText <- renderText({ runif(1) })
  })
  output$eText <- renderText({
    etext()
  })
})

shinyApp(ui=ui,server=server) 

eventReactive crée une valeur réactive qui change en fonction du eventExprobserveEvent est simplement déclenché sur la base de eventExpr

18
répondu Oskar Forsmo 2015-11-04 11:29:58

C'est comme la différence entre observe et reactive. L'un est destiné à être exécuté lorsque certains réactive variable est "déclenchée" est destinée à avoir des effets secondaires (observeEvent), et l'autre renvoie un réactif de valeur et est destiné à être utilisé comme une variable (eventReactive). Même dans la documentation relative à ces fonctions, la première est indiquée sans être affectée à une variable (parce qu'elle ne vise qu'à produire un effet secondaire), et la seconde est indiquée comme étant affectée à une variable et utilisée plus tard.

22
répondu Dean Attali 2015-11-04 11:13:04

je pense que le haut niveau des aspects pratiques doivent être mis en évidence ici.

  • eventReactive crée un objet vous définir comme reactive fait, mais avec le comportement habituel de réaction en chaîne vous obtenez à partir de reactive. Cependant, il est évalué et mis en cache comme le d'autres reactives.

  • observeEvent ne peut pas créer un objet que vous définissez (il crée quelque chose d'autre). Elle est immédiatement évaluée et non mise en cache. C'est pour causer des effets secondaires.

donc si vous avez besoin d'une base de données, ou d'un vecteur, ou d'un graphe ou quelque chose, mais que vous voulez découpler des réactions réactives en chaîne habituelles, utilisez eventReactive.

Si vous voulez juste pour provoquer immédiatement un effet secondaire observeEvent est votre billet.

8
répondu Mike Wise 2017-02-08 16:20:11

si je comprends bien, corrigez-moi et ajoutez plus d'information au besoin . La plupart des informations proviennent de https://shiny.rstudio.com/articles/action-buttons.html

  • il se peut aussi que cela ait été demandé il y a longtemps, j'ai eu la même question en passant par eventReactive () et observeEvent ()
  • ObeserveEvent , être plus comme un déclencheur pour un événement tout en eventReactive , être plus comme un retard
  • ci-dessous j'essaie le même code, en utilisant les deux fonctions réactives

pour construire plusieurs boutons d'action qui contrôlent le même objet, combinez les appels observeEvent() avec reactiveValues() , ici je peux utiliser deux boutons d'action qui fonctionnent en même temps dans le même code.

Code.1 donne l'effet d'observation()

Code.2 utilise eventReactive (), mais si j'essaie d'utiliser deux boutons d'action différents, seul le dernier fonctionne le bouton Précédent est nulle et n'a pas réagi

  • Code 1

        library(shiny)
    
        ui<-fluidPage(
          actionButton("runif", "uniform"),
          actionButton("rnorm", "Normal"),
          hr(),
          plotOutput("plot")
        )
    
        server<-function(input, output){
          v<-reactiveValues(data=NULL)
    
          observeEvent(
            input$runif,
            {
            v$data<-runif(100)
            }
          )
    
          observeEvent(
            input$rnorm,
            {
            v$data<-rnorm(100)
            }
          )
    
          output$plot <- renderPlot(
            {
              if (is.null(v$data)) return()
              hist(v$data)
            }
          )
        }
    
    shinyApp(ui, server)
    
  • code2

       library(shiny)
    
       ui<-fluidPage(
        actionButton(inputId = "norm", label = "Normal"),
        actionButton(inputId = "unif", label = "Uniform"),
    
      #Normal
      plotOutput("hist")
    )
    
    server <- function(input, output) {
    
      dnorm <- eventReactive(input$norm, {rnorm(100)})
      dunif <- eventReactive(input$unif, {runif(100)})
    
      output$hist <- renderPlot({  
        hist(dfnorm())
      })
    
      output$hist <- renderPlot({  
        hist(dunif())
      })
    }
    
    shinyApp(ui, server)
    
3
répondu Sandeep Anand 2017-06-03 18:50:31