2013-08-18 11 views
18

Ho un grafico nell'interfaccia utente lucido. Se cambio qualche parametro di input e attraverso il diagramma di reattività cambierò. Ma prendiamo in considerazione la seguente situazione: - La trama in Shiny UI di tracciamento lascia dire movimento di prezzo intra-day di un titolo. E per questo si interroga qualche fonte di dati in tempo reale. Ora Se creo un pulsante di aggiornamento e poi se il tempo passa, continuo a fare clic sul pulsante Aggiorna. La trama verrà aggiornata man mano che i nuovi dati arrivano con il passare del tempo nella fonte di dati in tempo reale. Ora la mia domanda è che non voglio continuare a fare clic sul pulsante di aggiornamento. Ma voglio fare un ciclo con il timer in modo che controlli su un intervallo di tempo fisso e non appena arrivano nuovi dati, la trama si aggiornerà automaticamente. Qualcosa di Google Finance Graphs che continua ad aggiornare nel tempo.Grafico di aggiornamento/grafico con intervallo di tempo fisso

Quindi il problema può essere semplificata come segue: - Consideriamo questo esempio da Shiny sé: - ui.R

library(shiny)  

shinyUI(pageWithSidebar( 

    headerPanel("Hello Shiny!"), 

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

    mainPanel(
    plotOutput("distPlot") 
) 
)) 

e server.R

library(shiny) 

shinyServer(function(input, output) { 

    output$distPlot <- renderPlot({ 

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

}) 

Ora voglio generare un campione casuale diverso dalla normale distribuzione senza alcuna attività di input. Quindi in pratica voglio chiamare

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

di nuovo senza cambiare cursoreInput. Per favore aiutami a scoprire come farlo.

+0

è possibile utilizzare un 'reactiveTimer'. Vedi '? ReactiveTimer' – jdharrison

+0

Penso che tu stia cercando' invalidateLater' – GSee

+1

Sì sia invalidateLater che reactiveTimer servono al mio scopo .. L'unica cosa è che invalidateLater deve essere implementato all'interno di un ambiente reattivo mentre reactiveTimer è quello di creare una sorgente reattiva [ripetendo semplicemente il fatto di chiarire]. Sono nuovo in R Shiny, ecco perché mi ci è voluto poco tempo. – IndranilGayen

risposta

23

A titolo di esempio si può eseguire il seguente livello locale:

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) 
    }) 

    } 
)) 

Un campione normale diverso verrà generato ogni 5 secondi

+0

grazie mille questo è quello che farà il lavoro. Ma suppongo che aggiorni l'intera sessione. Ma fa il lavoro. Penso di aver ottenuto quello che stavo cercando. – IndranilGayen

+1

Ho avuto la stessa domanda e questa è esattamente la risposta di cui avevo bisogno. Grazie! –