web-dev-qa-db-ja.com

シャイニー:observeEventとeventReactiveの違いは何ですか?

リアクティブプログラミングに関するShinyのドキュメントを数回読みましたが、observeEventeventReactiveの違いを正しく理解できません。

ドキュメントには次のように書かれています:

イベントに応じてアクションを実行する場合は常にobserveEventを使用します。 (「値の再計算」は通常、アクションの実行としてカウントされないことに注意してください。そのためのeventReactiveを参照してください。)

....

EventReactiveを使用して、イベントに応じてのみ更新される計算値を作成します。これは通常のリアクティブ式に似ていますが、リアクティブ依存性から生じる通常の無効化をすべて無視する点が異なります。

試したすべての状況で、observeEventeventReactiveの使用に違いは見られませんでした(使用する機能に関係なく、コードは正常に機能し、パフォーマンスに明らかな影響はありません)。

この2つの本当の違いを理解するのを手伝ってもらえますか?理想的には、observeEventは機能するがeventReactiveは機能せず、その逆の場合は、それらが交換可能であることを示すいくつかの例を示します。

51
lucacerone

@daataliが言っているように、2つの関数は異なる目的に使用されます。

ui <- shinyUI(pageWithSidebar(
  headerPanel("eventReactive and observeEvent"),
  sidebarPanel(
    actionButton("evReactiveButton", "eventReactive"),
    br(),
    actionButton("obsEventButton", "observeEvent"),
    br(),
    actionButton("evReactiveButton2", "eventReactive2")
  ),
  mainPanel(
    verbatimTextOutput("eText"),
    verbatimTextOutput("oText")
  )
))

server <- shinyServer(function(input, output) {
  etext <- eventReactive(input$evReactiveButton, {
    runif(1)
  })
  observeEvent(input$obsEventButton,{
    output$oText <- renderText({ runif(1) })
  })
  eventReactive(input$evReactiveButton2,{
    print("Will not print")
    output$oText <- renderText({ runif(1) })
  })
  output$eText <- renderText({
    etext()
  })
})

shinyApp(ui=ui,server=server) 

eventReactiveは、eventExprに基づいて変化するリアクティブ値を作成しますが、observeEventは、eventExprに基づいてトリガーされます

26
Oskar Forsmo

observereactiveの違いのようなものです。 1つは、一部のリアクティブ変数が「トリガー」されたときに実行されることを意図しており、副作用(observeEvent)を持つことを意味し、もう1つはリアクティブ値を返し、変数として使用されることを意図しています(eventReactive)。これらの関数のドキュメントでも、前者は変数に割り当てられずに表示され(副作用を引き起こすことを目的としているため)、後者は変数に割り当てられて後で使用されることが示されています。

33
DeanAttali

ここでは、トップレベルの実用的な側面を強調する必要があると思います。

  • eventReactiveは、reactiveのようにyo定義するオブジェクトを作成しますが、reactiveから得られる通常の連鎖反応動作はありません。ただし、他のreactivesと同様に遅延評価およびキャッシュされます。

  • observeEventは、定義したオブジェクトを作成できません(別のオブジェクトを作成します)。すぐに評価され、キャッシュされません。副作用を引き起こすためです。

したがって、データフレーム、ベクトル、またはプロットなどが必要で、通常のリアクティブチェーン反応から切り離したい場合は、eventReactiveを使用します。

ただちに副作用を引き起こしたい場合は、observeEventがチケットです。

13
Mike Wise

これを理解する方法を提供し、私を修正し、必要に応じてさらに情報を追加します。ほとんどの情報は https://shiny.rstudio.com/articles/action-buttons.html からのものです

  • また、これはずっと前に質問されている可能性がありますが、eventReactive()とobserveEvent()を通過するときに同じ質問がありました
  • ObeserveEventは、イベントのトリガーのようであり、eventReactiveは遅延のようです
  • 以下では、両方のリアクティブ関数を使用して同じコードを試します

同じオブジェクトを制御する複数のアクションボタンを作成するには、observeEvent()呼び出しとreactValues()を組み合わせます。ここでは、同じコードで同時に動作する2つのactionButtonを使用できます。

Code.1 observeElement()の効果を与える

Code.2はeventReactive()を使用しますが、2つの異なるactionButtonsを使用しようとすると、最新のもののみが機能し、前のボタンはnullであり、反応しませんでした

  • コード1

        library(shiny)
    
        ui<-fluidPage(
          actionButton("runif", "uniform"),
          actionButton("rnorm", "Normal"),
          hr(),
          plotOutput("plot")
        )
    
        server<-function(input, output){
          v<-reactiveValues(data=NULL)
    
          observeEvent(
            input$runif,
            {
            v$data<-runif(100)
            }
          )
    
          observeEvent(
            input$rnorm,
            {
            v$data<-rnorm(100)
            }
          )
    
          output$plot <- renderPlot(
            {
              if (is.null(v$data)) return()
              hist(v$data)
            }
          )
        }
    
    shinyApp(ui, server)
    
  • code2

       library(shiny)
    
       ui<-fluidPage(
        actionButton(inputId = "norm", label = "Normal"),
        actionButton(inputId = "unif", label = "Uniform"),
    
      #Normal
      plotOutput("hist")
    )
    
    server <- function(input, output) {
    
      dnorm <- eventReactive(input$norm, {rnorm(100)})
      dunif <- eventReactive(input$unif, {runif(100)})
    
      output$hist <- renderPlot({  
        hist(dfnorm())
      })
    
      output$hist <- renderPlot({  
        hist(dunif())
      })
    }
    
    shinyApp(ui, server)
    
4
Sandeep Anand