2015-11-02 196 views
2

我想創建一個Shiny應用程序來顯示實時收集的數據。對於這個我使用invalidateLater(5000, session)定期更新R.用實時數據創建一個閃亮的應用程序

這裏的數據是我server.R文件的概要:

library(shiny) 
library(magrittr) 

# Function to get new observations 
get_new_data <- function(){ 
    data <- rnorm(5) %>% rbind %>% data.frame 
    return(data) 
} 

# Initialize my_data 
my_data <- get_new_data() 

# Function to update my_data 
update_data <- function(){ 
    my_data <- rbind(get_new_data(), my_data) 
} 

shinyServer(function(input, output, session){ 

    # Plot the 30 most recent values 
    output$first_column <- renderPlot({ 
    invalidateLater(5000, session) 
    update_data() 
    plot(X1 ~ 1, data=my_data[1:30,], ylim=c(-3, 3), las=1) 
    }) 

}) 

我遇到的問題是,我想說明的ñ最最近的值,但無法弄清楚如何保持舊值。因此,不是繪製最近的30個值,而是繪製1個值。

有誰知道正確的方式來設置一個Shiny應用程序更新與新的數據,同時保持舊?

+1

我想問題出在你的plot()調用中。每當你打電話時它會產生一個新的情節。嘗試使用'plot()'僅用於第一個繪圖,然後用'points()'繪製所有隨後的繪圖 –

+0

我看到的問題是每個觀察的指數都增加。所以使用'points()'將會添加到圖中,但只有在x = 1時。 – user12202013

+0

研究一些JS庫,因爲它們提供驚人的功能時,實時 –

回答

10

這個工作對我來說:

library(shiny) 
library(magrittr) 

ui <- shinyServer(fluidPage(
    plotOutput("first_column") 
)) 

server <- shinyServer(function(input, output, session){ 
    # Function to get new observations 
    get_new_data <- function(){ 
    data <- rnorm(5) %>% rbind %>% data.frame 
    return(data) 
    } 

    # Initialize my_data 
    my_data <<- get_new_data() 

    # Function to update my_data 
    update_data <- function(){ 
    my_data <<- rbind(get_new_data(), my_data) 
    } 

    # Plot the 30 most recent values 
    output$first_column <- renderPlot({ 
    print("Render") 
    invalidateLater(1000, session) 
    update_data() 
    print(my_data) 
    plot(X1 ~ 1, data=my_data[1:30,], ylim=c(-3, 3), las=1, type="l") 
    }) 
}) 

shinyApp(ui=ui,server=server) 

的問題是隻是my_data是在錯誤的範圍內進行更新。只要記住不要永遠留戀。

相關問題