如何使Shiny应用程序从文件中连续读取?

时间:2018-11-24 05:29:04

标签: r shiny

我正在编写一个相对简单的Shiny应用程序,该应用程序基本上需要读取一个文件,执行一些计算以创建一个新变量,并输出该变量最近5点的平均值。该应用程序的非常简化的版本:

require(shiny)

x1 <- 42
df.data <- read.csv("data.csv")
df.data$y2 <- df.data$y1/x1

ui <- fluidPage(
      h5(textOutput("calc1"))
)

server <- function(input, output, session) {

    output$calc1 <- renderText({
                    az <- nrow(df.data)
                    aa <- az - 5
                    y5m <- mean(df.data$y2[aa:az], na.rm=TRUE)
                    })
}

shinyApp(ui=ui, server=server)

通过外部程序每分钟更新一次文件。我正在苦苦挣扎的部分是如何使应用程序读取文件(例如,每2分钟读取一次)并保持最近5分钟的平均值更新。

我已经阅读了有关反应性的内容,但是在读取文件时似乎无法使其正常工作。我是Shiny的新手,所以也许我缺少一些基本概念。 有什么建议吗?

reactiveFileReader是我一直在尝试使用的功能,但无法使其正常工作。我想念什么?

server <- function(input, output, session) {
          df.data <- reactiveFileReader(1000, NULL, "data.csv", header=F)
          output$calc1 <- renderText({ ... })
}

1 个答案:

答案 0 :(得分:2)

通过使用invalidateLater()函数,我们可以做到这一点。

require(shiny)
ui <- fluidPage(
  h5(textOutput("calc1"))
)

server <- function(input, output, session) {
  df <- reactive({
    invalidateLater(120000, session) # equivalent milliseconds for 2 minutes
    x1 <- 42
    df.data <- read.csv("data.csv")
    df.data$y2 <- df.data$y1/x1
    return(df.data)
    })
  output$calc1 <- renderText({
    az <- nrow(df())
    aa <- az - 5
    y5m <- mean(df()$y2[aa:az], na.rm = TRUE)
  })
}

shinyApp(ui=ui, server=server)