Блестящий: в чем разница между функцией наблюдения и событием?
Я читал Блестящую документацию об реактивном программировании несколько раз, но я не могу правильно понять разницу между observeEvent
и eventReactive
.
В документации написано:
Использовать функцию наблюдения, когда вы хотите выполнить действие в ответ на событие. (Обратите внимание, что "пересчитать значение" обычно не считается как действие action-see eventReactive для этого.)
....
Используйте eventReactive для создания вычисленного значения, которое обновляется только в ответ на событие. Это похоже на нормальное реактивное выражение, за исключением того, что оно игнорирует все обычные недействительности, возникающие из его реактивных зависимостей;
Во всей ситуации, которую я пробовал, я не видел разницы между использованием observeEvent
и eventReactive
(код работает отлично, независимо от используемой функции, без видимого влияния на производительность).
Можете ли вы помочь мне разобраться, какова реальная разница между ними? В идеале я хотел бы привести несколько примеров, показывающих, когда они взаимозаменяемы, когда observeEvent
будет работать, но не eventReactive
и наоборот.
Ответы
Ответ 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)