2014-11-28 15 views
5

Projektu animowanego wykresu tworzę za pomocą R Studio's Shiny. Obecnie "Go!" Przycisk inicjuje animację. Chciałbym, aby przycisk "Resetuj" ponownie zainicjował zmienne i ponownie uruchomił animację, ale ponieważ Shiny nie pozwala na wprowadzanie zmian w kodzie do wartości wejściowych $ button, utknąłem, jak to zrobić. Prawdziwy projekt jest podobny w formie do bloków przykładowych poniżej, ale znacznie bardziej zaangażowany. Animacja jest integralną częścią przekazywanych informacji. Kiedy projekt zostanie ukończony, zamierzam go wdrożyć na serwerze Shiny, więc chciałbym, aby użytkownicy mogli ponownie uruchomić animację z różnymi wyborami bez potrzeby ponownego otwierania łącza.Resetuj animację w 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? 

    } 
    }) 
}) 

Odpowiedz

3

podstawie aplikacji było szybciej, aby dodać kolejną observe i wyzerować licznik do 1 przy użyciu globalnego operatora przypisania <<-. Zmieniłem też działkę tak, aby była zmiennymi indeksowanymi działki. Przyjrzyj się podobnemu problemowi, który mieli ludzie, here. UWAGA: W niektórych moich aplikacjach mam również przycisk pauzy, gdy użytkownik naciśnie przycisk startowy dwa razy, można to osiągnąć, sprawdzając, czy indeks przycisku jest podzielny przez dwa, czy nie, ponieważ za każdym razem, gdy przycisk jest kliknięty, zwiększa się o jeden.

Szukałem więcej informacji na temat Twojej aplikacji, upewniłem się, że zbierasz zbędnych obserwatorów, ponieważ możesz zabraknąć pamięci (spójrz na profil pamięci za pomocą Menedżera zadań). Spójrz na ten przykład: here, na przemian możesz skonfigurować funkcję wylogowania na sesję, w której klient zostanie wylogowany po upływie 1 minuty.

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)) 
Powiązane problemy