2013-08-18 19 views
18

Mam działkę w Shiny UI. Jeśli zmienię dowolny parametr wejściowy i przez wykres reakcji zmieni się. Ale zastanówmy się nad następującą sytuacją: - Fabuła w Shiny UI plotowaniu pozwala powiedzieć ruch cenowy w ciągu dnia. W tym celu zapytanie o niektóre żywe źródła danych. Teraz Jeśli utworzę przycisk odświeżania, a następnie, jeśli upłynie czas, ciągle klikam przycisk odświeżania. Wykres zostanie zaktualizowany wraz z pojawieniem się nowych danych w miarę upływu czasu w tym źródle danych. Teraz moje pytanie brzmi: nie chcę ciągle klikać przycisku odświeżania. Ale chcę uruchomić pętlę z timerem, aby sprawdzał w ustalonym przedziale czasu i jak tylko pojawią się nowe dane, wykres zostanie automatycznie zaktualizowany. Coś w rodzaju wykresów finansowych Google, które aktualizują się z biegiem czasu.Aktualizacja wykresu/wykresu w ustalonym przedziale czasu

więc problem może być uproszczona, co następuje: - Rozważmy ten przykład z błyszczące samego: - ui.R

library(shiny)  

shinyUI(pageWithSidebar( 

    headerPanel("Hello Shiny!"), 

    sidebarPanel(
    sliderInput("obs", 
       "Number of observations:", 
       min = 1, 
       max = 1000, 
       value = 500) 
), 

    mainPanel(
    plotOutput("distPlot") 
) 
)) 

i server.R

library(shiny) 

shinyServer(function(input, output) { 

    output$distPlot <- renderPlot({ 

    # generate an rnorm distribution and plot it 
    dist <- rnorm(input$obs) 
    hist(dist) 
    }) 

}) 

Teraz chcę wygenerować inną próbkę losową z rozkładu normalnego bez żadnej aktywności wejściowej. Zasadniczo chcę ponownie zadzwonić pod numer

dist <- rnorm(input$obs) 
hist(dist) 

bez zmiany sliderInput. Pomóż mi dowiedzieć się, jak to zrobić.

+0

można użyć 'reactiveTimer'. Zobacz '? ReactiveTimer' – jdharrison

+0

Myślę, że szukasz' invalidateLater' – GSee

+1

Tak, zarówno invalidateLater, jak i reactiveTimer służą mojemu celowi. Jedyną rzeczą jest to, że invalidateLater musi być zaimplementowany w środowisku reaktywnym, podczas gdy reactiveTimer ma tworzyć reaktywne źródło [tylko powtarzanie fakt dla wyjaśnienia]. Jestem nowy w R Shiny, dlatego zajęło mi to trochę czasu. – IndranilGayen

Odpowiedz

23

Jako przykład można uruchomić następujące lokalnie:

library(shiny) 

runApp(list(
    ui = pageWithSidebar( 

    headerPanel("Hello Shiny!"), 

    sidebarPanel(
    sliderInput("obs", 
       "Number of observations:", 
       min = 1, 
       max = 1000, 
       value = 500) 
), 

    mainPanel(
    plotOutput("distPlot") 
) 
), 
    server =function(input, output, session) { 
    autoInvalidate <- reactiveTimer(5000, session) 
    output$distPlot <- renderPlot({ 
     autoInvalidate() 
     # generate an rnorm distribution and plot it 
     dist <- rnorm(input$obs) 
     hist(dist) 
    }) 

    } 
)) 

inny normalny próbka zostanie wygenerowany co 5 sekund

+0

dziękuję bardzo, że to się spełni. Ale myślę, że odświeży całą sesję. Ale wykonuje to zadanie. Myślę, że dostałem to, czego szukałem. – IndranilGayen

+1

Miałem to samo pytanie i to jest dokładnie odpowiedź, której potrzebowałem. Dzięki! –