2014-11-28 31 views
5

Sto costruendo un progetto grafico animato usando R Studio's Shiny. Attualmente il "Go!" pulsante avvia l'animazione. Mi piacerebbe avere il pulsante "Ripristina" reinizializzare le variabili ed eseguire nuovamente l'animazione, ma poiché Shiny non consente modifiche all'interno del codice ai valori del pulsante $ di input, sono bloccato su come farlo. Il vero progetto è simile nella forma ai blocchi di esempio sottostanti, ma molto più coinvolto. L'animazione è parte integrante delle informazioni trasmesse. Quando il progetto è completato, ho intenzione di distribuirlo sul server Shiny, quindi vorrei che gli utenti fossero in grado di rieseguire l'animazione con selezioni diverse senza dover riaprire il collegamento.Ripristina animazione 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? 

    } 
    }) 
}) 

risposta

3

Sulla base della sua applicazione era più veloce per aggiungere un altro observe e azzerare il contatore a 1 utilizzando l'operatore di assegnazione globale <<-. Inoltre ho cambiato la trama in modo che sia trame le variabili indicizzate. Dai un'occhiata al problema simile riscontrato dalla gente, here. NB: In alcune delle mie app ho anche il pulsante di pausa quando un utente preme il pulsante di avvio due volte, è possibile ottenere questo risultato controllando se l'indice del pulsante è divisibile per due o meno poiché ogni volta che si fa clic il pulsante aumenta di uno.

Stavo esaminando ulteriormente la tua app, assicurandoti di raccogliere gli osservatori senza referenze, dato che potresti esaurire la memoria (guarda il profilo della memoria tramite Task Manager). Esaminare questo esempio here, alternativamente è possibile impostare una funzionalità di disconnessione per sessione in cui il client verrà disconnesso dopo n. quantità di minuti.

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)) 
Problemi correlati