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

Hil*_*ers 74 r shiny

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

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

在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
    }
  })
Run Code Online (Sandbox Code Playgroud)

但if-else子句不起作用

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

- >我可以使用某种动作组合器功能用于该mainplot.click$click | input$spec_button子句吗?

Dun*_*own 84

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

observeEvent({ 
  input$spec_button
  mainplot.click$click
  1
}, { ... } )
Run Code Online (Sandbox Code Playgroud)

  • 只是一个警告:`observeEvent`默认使用`ignoreNULL = TRUE`,这意味着如果`mainplot.click $ click`(返回值)是'NULL`,即使`输入,处理程序也将****$ spec_button`已更改.我建议@ JustAnother的答案,以防止陷入这个陷阱. (8认同)
  • 你能确定哪个事件被触发了吗? (3认同)

小智 45

也:

observeEvent(c( 
  input$spec_button,
  mainplot.click$click
), { ... } )
Run Code Online (Sandbox Code Playgroud)

  • 虽然这看起来与@DuncanBrown的答案非常相似,但我发现了一个情况,其中2个动作按钮都触发模态,这个工作,而`{`版本没有.我无法解释为什么会这样. (6认同)
  • 在@Duncan Brown的答案中添加了注释,说明此答案有何不同(以及更好的IMO) (2认同)

Sel*_*bas 6

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

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

output$mypotput <- eventReactive( xxchange(), {
...
...
...
} )
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常好的答案,可以从更多的解释中受益.虽然接受的答案更简单,使其更适合基本程序,但这个答案更适合于大型复杂的代码.答案中似乎缺少两点(1)粘贴(或列表)将两个事件放在同一行,使代码更紧凑.(2)如果多个侦听器正在侦听同一组事件,则被动对象可以省去一遍又一遍地重复相同的两个事件的工作. (3认同)

JD *_*ell 6

这仍然可以通过 eventReactive 将您的操作放入向量中来完成。

eventReactive(
  c(input$spec_button, mainplot.click$click), 
{ ... } )
Run Code Online (Sandbox Code Playgroud)


Hil*_*ers 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)  
  })
Run Code Online (Sandbox Code Playgroud)

  • `list(mainplot.click$click, input$spec_button)` 也适用于 OP。 (3认同)