2013-08-18 4 views
18

У меня есть сюжет в Блестящем интерфейсе. Если я изменю какой-либо входной параметр и по графику реактивности изменится. Но давайте рассмотрим следующую ситуацию: - Сюжет в графическом дизайне Shiny UI позволяет говорить о внутридневном ценовом движении акций. И для этого вы запрашиваете источник данных в реальном времени. Теперь, если я создаю кнопку обновления, а затем, если время пройдет, я продолжаю нажимать кнопку обновления. Сюжет будет обновляться по мере поступления новых данных по мере того, как время идет в этот живой источник данных. Теперь мой вопрос: я не хочу, чтобы нажимать на кнопку обновления. Но я хочу запустить цикл с таймером, чтобы он проверял фиксированный интервал времени, и как только появятся новые данные, сюжет будет автоматически обновляться. Что-то вроде графиков Google Finance, которые постоянно обновляются.Обновление графика/графика с фиксированным интервалом времени

Таким образом, проблема может быть упрощена следующим образом: - Рассмотрим этот пример из самого Shiny: - ui.R

library(shiny)  

shinyUI(pageWithSidebar( 

    headerPanel("Hello Shiny!"), 

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

    mainPanel(
    plotOutput("distPlot") 
) 
)) 

и server.R

library(shiny) 

shinyServer(function(input, output) { 

    output$distPlot <- renderPlot({ 

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

}) 

Теперь я хочу генерировать другую случайную выборку из нормального распределения без какой-либо входной активности. Поэтому в основном я хочу позвонить

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

снова без изменения ползункаВход. Пожалуйста, помогите мне узнать, как это сделать.

+0

Вы можете использовать 'reactiveTimer'. См. '? ReactiveTimer' – jdharrison

+0

Я думаю, что вы ищете' invalidateLater' – GSee

+1

Да и invalidateLater и reactiveTimer служат моей цели .. Единственное, что invalidateLater должен быть реализован внутри реактивной среды, в то время как реактивныйTimer должен создать реактивный источник [просто повторяя факт для разъяснения]. Я новичок в R Shiny, поэтому мне потребовалось много времени. – IndranilGayen

ответ

23

В качестве примера можно запустить следующие локально:

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

    } 
)) 

Другой нормальный образец будет генерироваться каждые 5 секунд

+0

Большое спасибо за то, что будет делать это. Но я думаю, что это обновление всей сессии. Но это делает работу. Кажется, я получил то, что искал. – IndranilGayen

+1

У меня был тот же вопрос, и это именно тот ответ, который мне нужен. Благодаря! –