web-dev-qa-db-ja.com

Shiny eventReactiveハンドラー内で複数のイベント式をリッスンする方法

アプリのさまざまなプロット/出力で使用されているデータの更新をトリガーする2つの異なるイベントが必要です。 1つはクリックされたボタン(input$spec_button)で、もう1つはクリックされた点上のポイント(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
    }
  })

しかし、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句に使用できるアクション結合関数のようなものはありますか?

69
Hillary Sanders

これは古いことは知っていますが、同じ質問がありました。私はついにそれを理解しました。式を中括弧に入れて、イベント/リアクティブオブジェクトをリストするだけです。私の(根拠のない)推測では、shinyは標準のreactiveブロックと同じように、この式ブロックに対して同じリアクティブポインター解析を実行するだけです。

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

また:

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

私が思いついた解決策は次のとおりです。基本的に、空のreactiveValuesデータホルダーを作成し、2つの別個の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)  
  })
5
Hillary Sanders

リアクティブオブジェクトを作成してこの問題を解決し、イベント変更式で使用しました。以下のように:

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

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