2014-11-28 9 views
5

Ich erstelle ein animiertes Graph-Projekt mit dem Shiny von R Studio. Derzeit ist das "Go!" Schaltfläche initiiert die Animation. Ich möchte den "Reset" -Button haben, um die Variablen neu zu initialisieren und die Animation neu zu starten, aber da Shiny keine code-internen Änderungen an den Eingabe-Werten erlaubt, bleibe ich dabei. Das reale Projekt ähnelt in seiner Form den unten stehenden Beispielblöcken, ist aber viel komplizierter. Animation ist ein integraler Bestandteil der Informationen, die übermittelt werden. Wenn das Projekt abgeschlossen ist, möchte ich es auf dem Shiny-Server bereitstellen. Daher möchte ich, dass Benutzer die Animation mit verschiedenen Auswahlen erneut ausführen können, ohne den Link erneut öffnen zu müssen.Animation zurücksetzen in Shiny R Studio

# ui.R 
library(shiny) 

shinyUI(fluidPage(

    # Application title 
    headerPanel("Cost Explorer"), 


    sidebarPanel(
    actionButton("goButton", "Go!"), 
    actionButton("reset", "Reset"), 

    sliderInput("myvar", label=h6("Variability of cost"), 
       min=0, max=50, value=10) 
), 

    mainPanel(

    plotOutput(outputId="tsplot") 

) 
)) 

    # server.R 
library(shiny) 

shinyServer(function(input, output, session) { 

    # initialize reactive values 
    ts <- reactiveValues(cost=rep(NA,100), year=(2010:2109), counter=1) 

    output$tsplot <- renderPlot({ 
    plot(ts$year, ts$cost, xlim=c(2010,2110), ylim=c(-200,200), xlab="Year", 
     ylab="Cost (US Dollars)", type="l", main="Forecasted Cost Time series") 
    }) 

    observe({ 

    isolate({ 


     if (ts$counter==1){ 
      ts$cost[ts$counter]=50 #initial cost 
     } 
     if (ts$counter > 1){ 
      ts$cost[ts$counter]=ts$cost[ts$counter-1]+rnorm(1,0,input$myvar) 
     } 
     ts$counter=ts$counter+1 

    }) 

    if (((isolate(ts$counter) < 100)) & (input$goButton > 0)){ 
     invalidateLater(200, session) 
    } 
    if (input$reset > 0){ 
     # How do I add reset functionality? 

    } 
    }) 
}) 

Antwort

3

Basierend auf Ihrer Anwendung war es schneller eine andere observe hinzuzufügen und den Zähler auf 1 unter Verwendung des globalen Zuweisungsoperator <<- zurückgesetzt. Außerdem habe ich das Diagramm geändert, so dass es indizierte Variablen plottet. Werfen Sie einen Blick auf ähnliche Probleme, die Menschen hatten, here. NB: In einigen meiner Apps habe ich auch die Pause-Taste, wenn ein Benutzer zweimal auf die Start-Taste drückt. Sie können dies erreichen, indem Sie prüfen, ob der Index der Schaltfläche durch zwei teilbar ist oder nicht.

Ich schaute weiter in Ihre App, stellen Sie sicher, dass Sie Müll sammeln nicht referenzierte Beobachter sind, wie Sie möglicherweise nicht genügend Arbeitsspeicher (siehe das Speicherprofil über Task-Manager). Sehen Sie sich dieses Beispiel here an. Alternativ können Sie eine Abmeldefunktion pro Sitzung einrichten, bei der der Client nach n Minuten abgemeldet wird.

rm(list = ls()) 
library(shiny) 

ui <- (fluidPage(
    # Application title 
    headerPanel("Cost Explorer"), 

    sidebarPanel(
    actionButton("goButton", "Go!"), 
    actionButton("reset", "Reset"), 
    sliderInput("myvar", label=h6("Variability of cost"),min=0, max=50, value=10) 
), 
    mainPanel(plotOutput(outputId="tsplot")) 
)) 

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

    # initialize reactive values 
    ts <- reactiveValues(cost=rep(NA,100), year=(2010:2109), counter=1) 

    output$tsplot <- renderPlot({ 
    plot(ts$year[1:ts$counter], ts$cost[1:ts$counter], xlim=c(2010,2110), ylim=c(-200,200), xlab="Year", 
     ylab="Cost (US Dollars)", type="l", main="Forecasted Cost Time series") 
    }) 

    observe({ 
    isolate({ 
     if (ts$counter==1){ 
     ts$cost[ts$counter]=50 #initial cost 
     } 
     if (ts$counter > 1){ 
     ts$cost[ts$counter]=ts$cost[ts$counter-1]+rnorm(1,0,input$myvar) 
     } 
     ts$counter=ts$counter+1  
    }) 
    if (((isolate(ts$counter) < 100)) & (input$goButton > 0)){ 
     invalidateLater(200, session) 
    } 

    }) 

    observe({ 
    if (input$reset > 0){ 
     ts$counter <<- 1 
    } 
    }) 
}) 

runApp(list(ui = ui, server = server))