【问题标题】:Avoid re-loading datasets within a reactive in shiny避免在闪亮的反应中重新加载数据集
【发布时间】:2016-08-28 23:22:34
【问题描述】:

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

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

}))

实际上,我读入的文件很大,所以我想避免在每次 input$data 更改时读取它们,如果它已经完成了一次。例如,通过使矩阵 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 个可能的输入文件,但每个用户可能只想使用一两个。

【问题讨论】:

    标签: input shiny reactive-programming


    【解决方案1】:

    你可以做类似的事情

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

    【讨论】:

      猜你喜欢
      • 2018-03-28
      • 2022-06-29
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      • 2015-03-17
      • 2015-09-08
      相关资源
      最近更新 更多