避免在闪亮的反应中重新加载数据集

时间:2016-08-28 23:22:34

标签: input shiny reactive-programming

我有一个闪亮的应用程序,需要从几个文件之一输入。一个简化的例子是:

library(shiny)
x <- matrix(rnorm(20), ncol=2)
y <- matrix(rnorm(10), ncol=4)
write.csv(x, 'test_x.csv')
write.csv(y, 'test_y.csv')
runApp(list(ui = fluidPage(
   titlePanel("Choose dataset"),
   sidebarLayout(
      sidebarPanel(
          selectInput("data", "Dataset", c("x", "y"), selected="x")    
      ),
      mainPanel(
          tableOutput('contents')
      )
   )
)
, server = function(input, output, session){
myData <- reactive({
    inFile <- paste0("test_", input$data, ".csv")
    data <- read.csv(inFile, header=FALSE)
    data
})
    output$contents <- renderTable({
         myData()
})

}))

实际上,我读入的文件非常大,所以我想避免在每次输入$ data更改时读取它们,如果它已经完成一次。例如,通过在环境中使matrices mat_x和mat_y可用,然后在myData测试中:

if (!exists(paste0("mat_", input$data))) {
    inFile <- paste0("test_", input$data, ".csv")
    data <- read.csv(inFile, header=FALSE)
    assign(paste0("mat_", input$data), data)
}

有没有办法做到这一点,还是我必须为mat_x和mat_y创建一个单独的被动,并在myData中使用它?我实际上有9个可能的输入文件,但每个用户可能只想使用一个或两个。

1 个答案:

答案 0 :(得分:0)

您可以执行类似

的操作
myData <- reactive({
data <- fetch_data(input$data)
data
)}

fetch_data <- function(input) {
    if (!exists(paste0("mat_", input))) {
       inFile <- paste0("test_", input, ".csv")
       data <- read.csv(inFile, header=FALSE)
       assign(paste0("mat_", input), data)
    } else {
       data <- paste0("mat_", input)
    } 
    return (data)
}