リアクティブプログラミングに関するShinyのドキュメントを数回読みましたが、observeEvent
とeventReactive
の違いを正しく理解できません。
ドキュメントには次のように書かれています:
イベントに応じてアクションを実行する場合は常にobserveEventを使用します。 (「値の再計算」は通常、アクションの実行としてカウントされないことに注意してください。そのためのeventReactiveを参照してください。)
....
EventReactiveを使用して、イベントに応じてのみ更新される計算値を作成します。これは通常のリアクティブ式に似ていますが、リアクティブ依存性から生じる通常の無効化をすべて無視する点が異なります。
試したすべての状況で、observeEvent
とeventReactive
の使用に違いは見られませんでした(使用する機能に関係なく、コードは正常に機能し、パフォーマンスに明らかな影響はありません)。
この2つの本当の違いを理解するのを手伝ってもらえますか?理想的には、observeEvent
は機能するがeventReactive
は機能せず、その逆の場合は、それらが交換可能であることを示すいくつかの例を示します。
@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
に基づいてトリガーされます
observe
とreactive
の違いのようなものです。 1つは、一部のリアクティブ変数が「トリガー」されたときに実行されることを意図しており、副作用(observeEvent
)を持つことを意味し、もう1つはリアクティブ値を返し、変数として使用されることを意図しています(eventReactive
)。これらの関数のドキュメントでも、前者は変数に割り当てられずに表示され(副作用を引き起こすことを目的としているため)、後者は変数に割り当てられて後で使用されることが示されています。
ここでは、トップレベルの実用的な側面を強調する必要があると思います。
eventReactive
は、reactive
のようにyo定義するオブジェクトを作成しますが、reactive
から得られる通常の連鎖反応動作はありません。ただし、他のreactives
と同様に遅延評価およびキャッシュされます。
observeEvent
は、定義したオブジェクトを作成できません(別のオブジェクトを作成します)。すぐに評価され、キャッシュされません。副作用を引き起こすためです。
したがって、データフレーム、ベクトル、またはプロットなどが必要で、通常のリアクティブチェーン反応から切り離したい場合は、eventReactive
を使用します。
ただちに副作用を引き起こしたい場合は、observeEvent
がチケットです。
これを理解する方法を提供し、私を修正し、必要に応じてさらに情報を追加します。ほとんどの情報は https://shiny.rstudio.com/articles/action-buttons.html からのものです
同じオブジェクトを制御する複数のアクションボタンを作成するには、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)