web-dev-qa-db-fra.com

Comment écouter plus d'une expression d'événement dans un gestionnaire Shiny eventReactive

Je souhaite que deux événements différents déclenchent une mise à jour des données utilisées par divers tracés/sorties dans mon application. L’un est un bouton sur lequel on clique (input$spec_button) et l’autre est un point sur un point sur lequel on clique (mainplot.click$click).

En gros, je veux lister les deux en même temps, mais je ne sais pas comment écrire le code. Voici ce que j'ai maintenant:

dans server.R:

data <- eventReactive({mainplot.click$click | input$spec_button}, {
    if(input$spec_button){
      # get data relevant to the button
    } else {
      # get data relevant to the point clicked
    }
  })

Mais la clause if-else ne fonctionne pas

Error in mainplot.click$click | input$spec_button : operations are possible only for numeric, logical or complex types

-> Existe-t-il une sorte de fonction de combinaison d’actions que je peux utiliser pour le mainplot.click$click | input$spec_button clause?

69
Hillary Sanders

Je sais que c'est vieux, mais j'avais la même question. J'ai finalement compris. Vous incluez une expression entre accolades et vous ne faites que lister les événements/objets réactifs. Mon hypothèse (non fondée) est que shiny effectue simplement la même analyse de pointeur réactif pour ce bloc d'expression que pour un bloc standard reactive.

observeEvent({ 
  input$spec_button
  mainplot.click$click
}, { ... } )
79
Duncan Brown

Également:

observeEvent(c( 
  input$spec_button,
  mainplot.click$click
), { ... } )
41
JustAnother

Voici la solution que j'ai proposée: en gros, créez un détenteur de données reactiveValues vide, puis modifiez ses valeurs en fonction de deux instances distinctes observeEvent.

  data <- reactiveValues()
  observeEvent(input$spec_button, {
    data$data <- get.focus.spec(input=input, premise=premise, 
                                itemname=input$dropdown.itemname, spec.info=spec.info)
  })
  observeEvent(mainplot.click$click, {
    data$data <- get.focus.spec(input=input, premise=premise, mainplot=mainplot(),
                                mainplot.click_focus=mainplot.click_focus(),
                                spec.info=spec.info)  
  })
5
Hillary Sanders

J'ai résolu ce problème en créant un objet réactif et en l'utilisant dans l'expression de changement d'événement. Comme ci-dessous:

xxchange <- reactive({
paste(input$filter , input$term)
})

output$mypotput <- eventReactive( xxchange(), {
...
...
...
} )
5
Selcuk Akbas