web-dev-qa-db-ja.com

シャイニーobserveEvent内で複数のイベント式をリッスンする方法

2つの異なるイベントでオブザーバーをトリガーしたいと思います。 ここ これが機能するはずであることが提案されました。しかし、それは2番目のイベントにのみ依存しているようです。

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)

ボタンをクリックしなくてもメッセージを印刷します。

12
Kipras Kančys

これでうまくいくはずです。@ 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)
8
Pork Chop