闪亮:observeEvent和eventReactive有什么区别?


77

现在我几次读到反应式编程的闪亮的文档,但我不能正确理解之间的差异observeEventeventReactive

该文档说:

每当您想执行响应事件的操作时,请使用observeEvent。(请注意,“重新计算值”通常不算是执行操作-有关此信息,请参见eventReactive。)

....

使用eventReactive创建仅响应事件而更新的计算值。这就像一个普通的反应式表达式,只是它忽略了来自其反应式依赖关系的所有常规失效。

在所有尝试的情况下,我都看不到使用observeEvent和之间的区别eventReactive(无论我使用什么功能,代码都可以正常工作,并且对性能没有明显影响)。

您能帮我弄清楚两者的真正区别是什么?理想情况下,我想举几个例子说明它们何时可以互换,一个何时observeEvent可以工作,但不可以eventReactive,反之亦然。

Answers:


42

就像@daatali所说的那样,这两个函数用于不同的目的。

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


乔·郑(Joe Cheng)称从观察者内部为渲染功能分配输出为“反解决方案”,“通常意味着作者对将渲染代码块分配给输出插槽有根本的误解”。我还没有完全明白这意味着什么。rstudio-pubs-static.s3.amazonaws.com/...
布鲁克斯安布罗斯

44

这就像之间的差异observereactive。一个打算在“触发”某个反应变量时运行,并具有副作用(observeEvent),另一个则返回反应值,并用作变量(eventReactive)。即使在这些功能的文档中,前者也未显示为分配给变量(因为它只是产生副作用),而后者被显示为分配了变量并在以后使用。


是否可以有一个reactiveValues对象“接收”一个eventReactive?据我了解,areactiveValues与相似reactive,但我仅阅读了observeEvent处理它们的示例。不知道该评论是否真的在该线程的范围内...但是,如果是这样的话,我可以打开一个新的...
user5029763 2015年

2
关于变量存储的出色说明。
d8aninja

16

我认为这里需要强调顶级的实践方面。

  • AneventReactive会创建定义的对象,就像定义的一样 reactive,但是您没有从中获得通常的链式反应行为reactive。但是,它像其他方法一样被懒惰地评估和缓存reactives

  • 一个observeEvent不能创建您定义(它创建别的东西)的对象。立即评估并且不对其进行缓存。它用于引起副作用。

因此,如果您需要数据框,向量,图或其他东西,但又想与通常的反应性链反应脱钩,请使用eventReactive

如果您仅想造成直接的副作用,那observeEvent就是您的机票。


4

提供我理解的方式,纠正我并根据需要添加更多信息。大多数信息来自https://shiny.rstudio.com/articles/action-buttons.html

  • 也可能是很久以前问过的,在通过eventReactive()和observeEvent()时我遇到了相同的问题
  • ObeserveEvent,更像是事件的触发器,而eventReactive,更像是延迟
  • 下面我尝试使用两个反应函数使用相同的代码

要构建几个控制同一对象的动作按钮,请将observeEvent()调用与reactValues()结合起来,在这里我可以使用两个在同一代码中同时起作用的actionButton。

Code.1产生observeElement()的效果

Code.2使用eventReactive(),但是如果我尝试使用两个不同的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)
    
  • 代码2

       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)
    

0

我发现有助于理解eventReactive

eventReactives与反应式类似,它们的构造如下:

eventReactive( event { 
code to run 
}) 

eventReactives不依赖于其主体中的所有反应式表达式(上面的代码段中的“运行代码”)。相反,它们仅取决于事件部分中指定的表达式。


尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会无效。-评分
Cainã马克斯·库托-席尔瓦
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.