如何在闪亮的EventResponsive处理程序中侦听多个事件表达式

如何在闪亮的EventResponsive处理程序中侦听多个事件表达式,r,shiny,R,Shiny,我想要两个不同的事件来触发我的应用程序中各种绘图/输出使用的数据更新。一个是正在单击的按钮(input$spec_button),另一个是正在单击的点上的点(mainplot.click$click) 基本上,我想同时列出这两种代码,但我不确定如何编写代码。以下是我现在拥有的: 在server.R中: data <- eventReactive({mainplot.click$click | input$spec_button}, { if(input$spec_button){

我想要两个不同的事件来触发我的应用程序中各种绘图/输出使用的数据更新。一个是正在单击的按钮(
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
    }
  })

data我想出了一个解决方案:基本上,创建一个空的
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)  
  })

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

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

更新以处理表达式中最后一行返回NULL的情况。只需返回一个常量值。

另外:

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

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

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

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

xxchange这仍然可以通过将您的操作放在向量中的EventResponsive来完成

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

这里的想法是创建一个反应函数,它将执行您希望在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(), 
    { ... } 
)

validate\u事件是否可以检查的输出!is.null(输入$spec_按钮)?将
列表(mainplot.click$click,input$spec_按钮)
也适用于OP的方式。虽然这看起来与@DuncanBrown的答案非常相似,但我发现有两个动作按钮都触发了模态,这起作用了,
{
版本没有。我无法解释为什么会这样。在@Duncan Brown的答案中添加了一条注释,说明这个答案有什么不同(在我看来更好)。这个答案对我不适用-我得到了一个错误(闪亮1.0.5)有没有办法找出触发了哪个事件?假设我有两个按钮,
input$button1
input$button2
,它们做的事情非常相似,只是索引不同。我希望避免因为不知道索引而多次复制代码。谢谢!将已接受的答案更改为这一个,因为看起来这是一个比我原来的解决方案更好的解决方案。你能确定触发了哪个事件吗?我不知道。我在一些情况下是这样做的,在单独的变量中跟踪它们,并亲自进行比较,看看哪些发生了变化。但这很难看。可能最好将主代码放在一个函数中,然后有两个观察事件t调用fn,然后为每个事件执行特定操作。只是一个警告:
observeEvent
默认使用
ignoreNULL=TRUE
,这意味着如果
mainplot。单击$click
(返回值)如果
NULL
,则即使更改了
input$spec_按钮
,也不会调用处理程序。我建议使用类似@justnather的答案,以避免落入此陷阱。另一个警告:在我的测试中,我发现此括号语法(
{}
)要求每个事件都位于其自己的换行上,否则它会失败当解析器遇到第二个事件时,“解析中出错…”。例如,所有事件都在一行:
observeEvent({input$spec_button mainplot.click$click},{…})
失败。@不管换行符是什么。这是一个非常好的答案,可以从更多的解释中受益。虽然被接受的答案更简单,更适合初级程序,但这个答案更适合大型和复杂的代码。答案中似乎缺少两点(1)粘贴(或列表)将两个事件放在同一行上,使代码更加紧凑。(2)如果多个侦听器正在侦听同一组事件,则被动对象可以省去反复重复相同两个事件的工作。