R 闪亮:观察事件和反应事件之间有什么区别?

R 闪亮:观察事件和反应事件之间有什么区别?,r,shiny,reactive-programming,shiny-server,R,Shiny,Reactive Programming,Shiny Server,现在,我阅读了几次有关反应式编程的精彩文档,但我无法正确理解observeEvent和eventReactive之间的区别 文件说: 无论何时,只要您想执行响应事件的操作,都可以使用ObserveeEvent。(请注意,“重新计算值”通常不算作执行操作–请参阅EventResponsive。) 使用EventResponsive创建仅在响应事件时更新的计算值。这就像一个普通的反应式表达式,只是它忽略了来自其反应式依赖项的所有常见失效 在我尝试过的所有情况下,我发现使用observeEvent和

现在,我阅读了几次有关反应式编程的精彩文档,但我无法正确理解
observeEvent
eventReactive
之间的区别

文件说:

无论何时,只要您想执行响应事件的操作,都可以使用ObserveeEvent。(请注意,“重新计算值”通常不算作执行操作–请参阅EventResponsive。)

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

在我尝试过的所有情况下,我发现使用
observeEvent
eventReactive
没有区别(无论我使用什么功能,代码都可以正常工作,对性能没有明显影响)


你能帮我找出两者的真正区别吗?理想情况下,我想举几个例子来说明它们何时是可互换的,其中一个例子是
observeEvent
可以工作,但不
eventReactive
,反之亦然。

这就像
observe
reactive
之间的区别。一个用于在“触发”某个反应变量并产生副作用时运行(
observeEvent
),另一个用于返回反应值并用作变量(
eventReactive
)。即使在这些函数的文档中,也没有将前者指定给变量(因为它只是为了产生副作用),而将后者指定给变量并在以后使用。

正如@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) 

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

  • eventReactive
    创建一个您定义为
    reactive
    有,但没有通常的连锁反应行为 从
    反应式
    。但是,它会像 其他
    反应性

  • observeEvent
    无法创建您定义(它)的对象 创造其他的东西)。它会立即计算,而不是缓存。 它是用来引起副作用的

因此,如果您需要一个数据帧、向量、绘图或其他东西,但希望与通常的反应性链式反应解耦,请使用
eventReactive


如果您只是想立即产生副作用,您可以选择观察事件。

提供我对此的理解方式,请纠正我的错误,并根据需要添加更多信息。大部分信息来自

  • 也可能是很久以前就有人问过这个问题,我在处理eventReactive()和observeEvent()时遇到了同样的问题
  • ObeserveEvent更像事件的触发器,而eventReactive更像延迟
  • 下面我尝试使用相同的代码,使用两个被动函数
要构建控制同一对象的多个动作按钮,请将observeEvent()调用与reactiveValues()结合起来,这里我可以使用两个动作按钮,它们在同一代码中同时工作

代码1给出了observeElement()的效果

Code.2使用eventReactive(),但如果我尝试使用两个不同的ActionButton,则只有最新的一个有效,而之前的按钮为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)
    
    库(闪亮)
    ui我发现有助于理解
    eventReactive

    eventreactive与reactive类似,它们被构造为 如下:

    eventreactive并不依赖于其主体中的所有反应表达式(“代码到 在上面的代码段中运行)。相反,它们只依赖于 事件部分中指定的表达式


    是否可能有一个
    reactiveValues
    对象“receive”一个
    eventReactive
    ?据我所知,
    reactiveValues
    类似于
    reactive
    ,但我只读过处理它们的
    observeEvent
    示例。不确定此评论是否真的在此线程范围内。。。但是如果是这样的话,我可以打开一个新的…关于变量存储的极好说明。虽然这个链接可以回答这个问题,但最好在这里包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。-fwiw Joe Cheng将从观察者内部指定渲染函数的输出称为“反解决方案”,这“通常意味着作者对将渲染代码块指定给输出槽的含义有一个基本的误解”。我还没有完全弄明白这意味着什么。
       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)
    
    eventReactive( event { 
    code to run 
    })