如何在Shiny eventReactive处理程序中侦听多个事件表达式

时间:2016-01-11 22:03:48

标签: r shiny

我想要两个不同的事件来触发我应用中各种图表/输出所使用的数据的更新。一个是单击按钮(input$spec_button),另一个是点击点(mainplot.click$click)上的点。

基本上,我想同时列出两者,但我不知道如何编写代码。这就是我现在所拥有的:

<\ n>在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
    }
  })

但是if-else子句不起作用

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

- &GT;我可以使用某种动作组合器函数用于mainplot.click$click | input$spec_button子句吗?

6 个答案:

答案 0 :(得分:71)

我知道这是旧的,但我有同样的问题。我终于弄明白了。您在大括号中包含一个表达式,只需列出事件/反应对象。我的(未经证实的)猜测是,闪亮只是对该表达式块执行与标准reactive块相同的反应指针分析。

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

答案 1 :(得分:34)

此外:

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

答案 2 :(得分:5)

以下是我提出的解决方案:基本上,创建一个空的reactiveValues数据持有者,然后根据两个单独的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)  
  })

答案 3 :(得分:5)

我通过创建一个反应对象并在事件更改表达式中使用它来解决了这个问题。如下:

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

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

答案 4 :(得分:1)

仅通过将操作放入向量中,仍然可以使用eventReactive来完成。

eventReactive(
  c(input$spec_button, mainplot.click$click), 
{ ... } )

答案 5 :(得分:0)

这里的想法是创建一个反应函数,该函数将执行要在observeEvent中传递的条件,然后您可以传递此反应函数来检查语句的有效性。例如:

validate_event <- reactive({
    # I have used OR condition here, you can use AND also
    req(input$spec_button) || req(mainplot.click$click)
})

observeEvent(validate_event(), 
    { ... } 
)

继续编码!