我正在编写一个相对简单的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({ ... })
}
答案 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)