2017-08-04 1 views
1

Ich erfahre unerwartetes Verhalten bei der Verwendung mehrerer reactiveVal in Shiny. Ich bin mir der Existenz von reactiveValues ​​bewusst, die wahrscheinlich mein Problem lösen werden, aber ich möchte immer noch herausfinden, warum dieses Verhalten auftritt. Im folgenden Code, ich habe zwei reactiveVals:Unerwartete Reaktivität während der Verwendung mehrerer reactiveVal in Shiny

  • reval1, die jede Sekunde
  • reval2 aktualisiert wird, die nie Wert ändert.

my_plot ist nur von reval2 abhängig. Daher würde ich erwarten, dass es niemals ungültig wird. Die Handlung ändert sich jedoch jede Sekunde. In der documentation sehe ich keine Erwähnung der Unmöglichkeit, zwei reaktive Werte zu verwenden. Fehle ich etwas falsch oder übersehe ich etwas?


server <- function(input, output, session) { 

    set.seed(1) 
    reval1<- reactiveVal(runif(1)) # useful 
    reval2 <- reactiveVal(runif(1)) # useless 

    # update reval1 every second 
    autoInvalidate <- reactiveTimer(intervalMs = 1000, session = session) 
    observeEvent(autoInvalidate(),{ 
    reval1(reval1()+1) 
    }) 

    # plot is only dependent on reval2. 
    output$my_plot<- renderPlot({ 
    a<- reval2() 
    df= data.frame(x=runif(10),y=runif(10)) 
    plot(df$x,df$y) 
    }) 

} 

ui <- shinyUI(
    fluidPage(
    plotOutput("my_plot") 
) 
) 

shinyApp(ui,server) 

Antwort

3

Dies ist ein bekanntes Problem. und sollte in der neuen Version von shiny behoben werden. In der Entwicklerversion sind bereits Fixes implementiert. Hinweis ich es selbst nicht getestet ...

https://github.com/rstudio/shiny/pull/1712

https://github.com/rstudio/shiny/issues/1710

+0

Danke, ich dies nicht bewusst war. Ich habe meinen Code über eine Stunde lang debuggt ... – Florian

+2

Da Sie eine Analytics-Firma haben, die auf glänzend basiert, wäre es gut für Sie, sich auch die github-Seite anzusehen, da sie dort neue Ausgaben haben. Abonnieren Sie auch diese Gruppe https://groups.google.com/forum/#!forum/shiny-discuss –

+0

Vielen Dank für die Einführung in diese Gruppe, sehr nützlich. – Florian

0

Das ist wirklich interessant, ich würde sogar einen Fehler in diesem Fall vor. Ich habe versucht, das als

server <- function(input, output, session) { 

    set.seed(1) 
    reval1 <- reactiveVal(runif(1)) # useful 
    reval2 <- reactiveVal(runif(1)) # useless 

    # update reval1 every second 
    autoInvalidate <- reactiveTimer(intervalMs = 1000) 
    observe({ 
    autoInvalidate() 
    reval1(reval1() + 1) 
    print(reval1()) 
    }) 

    # plot is only dependent on reval2. 
    output$my_plot<- renderPlot({ 
    a <- reval2() 
    df <- data.frame(x=runif(10),y=runif(10)) 
    plot(df$x, df$y) 
    }) 

} 

Umschreiben Sie es einige Browser und in diesem, die Handlung nicht einmal rendern. Sie können auch sehen, dass während der Laufzeit die observe() und output$my_plot in einer Schleife und konsequent mit viel kürzerer Zeit als 1000ms ausgelöst werden! Durch die Art und Weise ist dies das Reaktivität Grundstück:

Reactivity plot

Verwandte Themen