Ich habe die Shiny-Dokumentation über reaktive Programmierung jetzt einige Male gelesen, aber ich kann den Unterschied zwischen observeEvent
und nicht richtig verstehen eventReactive
.
Die Dokumentation sagt:
Verwenden Sie watchEvent, wenn Sie eine Aktion als Reaktion auf ein Ereignis ausführen möchten. (Beachten Sie, dass "Neuberechnung eines Werts" im Allgemeinen nicht als Ausführung einer Aktion gilt - siehe dazu eventReactive.)
....
Verwenden Sie eventReactive, um einen berechneten Wert zu erstellen, der nur als Reaktion auf ein Ereignis aktualisiert wird. Dies ist wie ein normaler reaktiver Ausdruck, außer dass alle üblichen Ungültigmachungen ignoriert werden, die sich aus seinen reaktiven Abhängigkeiten ergeben.
In all den Situationen, in denen ich es versucht habe, habe ich keinen Unterschied zwischen observeEvent
und gesehen eventReactive
(der Code funktioniert einwandfrei, unabhängig von der von mir verwendeten Funktion, ohne erkennbare Auswirkungen auf die Leistung).
Können Sie mir helfen, herauszufinden, was der wahre Unterschied zwischen den beiden ist? Idealerweise möchte ich ein paar Beispiele, die zeigen, wann sie austauschbar sind, eines, wenn observeEvent
es funktionieren würde, aber nicht eventReactive
und umgekehrt.
quelle
reactiveValues
Objekt a "empfängt"eventReactive
? Soweit ich weiß,reactiveValues
ähnelt a areactive
, aber ich habe nur Beispiele für denobserveEvent
Umgang mit ihnen gelesen . Ich bin mir nicht sicher, ob dieser Kommentar wirklich im Rahmen dieses Threads liegt ... aber wenn dies der Fall ist, kann ich einen neuen öffnen ...Ich denke, die praktischen Aspekte der obersten Ebene müssen hier hervorgehoben werden.
An
eventReactive
erstellt ein Objekt, das Sie wiereactive
gewohnt definieren , jedoch ohne das übliche Kettenreaktionsverhalten, von dem Sie ausgehenreactive
. Es wird jedoch träge ausgewertet und wie das andere zwischengespeichertreactives
.Ein
observeEvent
Objekt, das Sie definieren, kann nicht erstellt werden (es wird etwas anderes erstellt). Es wird sofort ausgewertet und nicht zwischengespeichert. Es ist für die Verursachung von Nebenwirkungen.Wenn Sie also einen Datenrahmen oder Vektor oder eine Darstellung oder etwas anderes benötigen, sich aber von den üblichen reaktiven Kettenreaktionen entkoppeln möchten, verwenden Sie
eventReactive
.Wenn Sie nur eine sofortige Nebenwirkung verursachen möchten,
observeEvent
ist Ihr Ticket.quelle
Wenn Sie dies so verstehen, korrigieren Sie mich und fügen Sie nach Bedarf weitere Informationen hinzu. Die meisten Informationen stammen von https://shiny.rstudio.com/articles/action-buttons.html
Code 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)
quelle