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.
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 eventExpr
observeEvent
est simplement déclenché sur la base de eventExpr
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.
je pense que le haut niveau des aspects pratiques doivent être mis en évidence ici.
eventReactive
crée un objet vous définir commereactive
fait, mais avec le comportement habituel de réaction en chaîne vous obtenez à partir dereactive
. Cependant, il est évalué et mis en cache comme le d'autresreactives
.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.
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)