Подтвердить что ты не робот

Блестящий: в чем разница между функцией наблюдения и событием?

Я читал Блестящую документацию об реактивном программировании несколько раз, но я не могу правильно понять разницу между observeEvent и eventReactive.

В документации написано:

Использовать функцию наблюдения, когда вы хотите выполнить действие в ответ на событие. (Обратите внимание, что "пересчитать значение" обычно не считается как действие action-see eventReactive для этого.)

....

Используйте eventReactive для создания вычисленного значения, которое обновляется только в ответ на событие. Это похоже на нормальное реактивное выражение, за исключением того, что оно игнорирует все обычные недействительности, возникающие из его реактивных зависимостей;

Во всей ситуации, которую я пробовал, я не видел разницы между использованием observeEvent и eventReactive (код работает отлично, независимо от используемой функции, без видимого влияния на производительность).

Можете ли вы помочь мне разобраться, какова реальная разница между ними? В идеале я хотел бы привести несколько примеров, показывающих, когда они взаимозаменяемы, когда observeEvent будет работать, но не eventReactive и наоборот.

4b9b3361

Ответ 1

Поскольку @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

Ответ 2

Это похоже на разницу между observe и reactive. Один из них предназначен для запуска, когда какая-либо реактивная переменная "срабатывает" и имеет побочные эффекты (observeEvent), а другая возвращает реактивное значение и предназначена для использования в качестве переменной (eventReactive). Даже в документации для этих функций первая показана без привязки к переменной (поскольку она предназначена для создания побочного эффекта), и последнее показано, что она назначается в переменную и используется позже.

Ответ 3

Я думаю, что здесь нужно подчеркнуть практические аспекты высшего уровня.

  • An eventReactive создает объект, который вы определяете как reactive, но без привычного поведения цепной реакции вы получаете от reactive. Однако он лениво оценивается и кэшируется, как другой reactives.

  • An observeEvent не может создать объект, который вы определяете (он создает что-то еще). Он сразу оценивается и не кэшируется. Это вызывает побочные эффекты.

Итак, если вам нужен кадр данных или вектор или сюжет или что-то еще, но вы хотите отделить от обычных реактивных цепных реакций, используйте eventReactive.

Если вы просто хотите вызвать немедленный побочный эффект, observeEvent - ваш билет.

Ответ 4

Предоставляя то, как я это понимаю, исправьте меня и добавьте дополнительную информацию по мере необходимости. Большая часть информации указана из https://shiny.rstudio.com/articles/action-buttons.html

  • Также возможно, что это было задано давно, у меня был тот же вопрос, проходя через eventReactive() и observEvent()
  • ObeserveEvent, более похожий на триггер события, а eventReactive, больше похож на задержку
  • Ниже я пытаюсь использовать тот же код, используя как реактивные функции

Чтобы создать несколько кнопок действий, которые управляют одним и тем же объектом, объедините вызовы observEvent() с реактивнымValues ​​(), здесь я могу использовать два кнопки действий, которые работают одновременно в одном и том же коде.

Код .1 Дает эффект элемента наблюдения()

Code.2 Использует eventReactive(), но если я пытаюсь использовать два разных кнопки действий, только последняя работает, то более ранняя кнопка имеет значение 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)