如何在Shiny observeEvent

时间:2017-01-31 15:10:01

标签: r shiny shiny-reactivity

我想要两个不同的事件来触发观察者。有人建议here这应该有效。但它似乎只取决于第二次事件。

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

看看这个例子。

ui <- shinyUI(bootstrapPage(
    actionButton("test1", "test1"),
    actionButton("test2", "test2"))
)

server <- shinyServer(function(input, output) {
    observeEvent({
        input$test1
        input$test2
    }, {
        print('Hello World')
    })
})

shinyApp(ui, server)

点击按钮test1后没有任何反应。如果单击按钮test2,它将打印到您的控制台。按下test2按钮后,单击test1打印消息。这是一种奇怪的行为。

that链接中的另一个建议是使用

list(input$test1, input$test2)

即使不点击按钮,也会打印信息。

2 个答案:

答案 0 :(得分:5)

这应该这样做,请注意你仍然需要检查@MrFlick提到的按钮是否被点击

1。您可以使用反应式表达式

#rm(list = ls())
library(shiny)
ui <- shinyUI(bootstrapPage(
  actionButton("test1", "test1"),
  actionButton("test2", "test2"))
)

server <- shinyServer(function(input, output) {

  toListen <- reactive({
    list(input$test1,input$test2)
  })
  observeEvent(toListen(), {
    if(input$test1==0 && input$test2==0){
      return()
    }
    print('Hello World')
  })
})

shinyApp(ui, server)

2。按照@MrFlick(现已删除)

给出的示例
#rm(list = ls())
library(shiny)
ui <- shinyUI(bootstrapPage(
  actionButton("test1", "test1"),
  actionButton("test2", "test2"))
)

server <- shinyServer(function(input, output) {

  observeEvent(input$test1 | input$test2, {
    if(input$test1==0 && input$test2==0){
      return()
    }
    print('Hello World')
  })
})

shinyApp(ui, server)

答案 1 :(得分:0)

observeEvent 是复杂的 observe 案例的包装。在这种特定情况下,当一个或其他无功值发生变化时,可以使用简单的观察。

require(shiny)    
ui <- basicPage(
      actionButton("test1", "test1"),
      actionButton("test2", "test2")
    )
    
    server <- function(input, output, session){
    
      observe( {
        input$test1
        input$test2
        if(input$test1==0 && input$test2==0){
          return()
        }
        print('Hello World')
        })
    }
    
    shinyApp(ui, server)

observeEvent 中使用选项来消除return()调用有一点意义:

ui <- basicPage(
  actionButton("test1", "test1"),
  actionButton("test2", "test2")
)

server <- function(input, output, session){

  observeEvent(input$test1 | input$test2, { print('Hello World') } , ignoreInit = TRUE)
}

shinyApp(ui, server)