我有一个闪亮的应用程序,需要从几个文件之一输入。一个简化的例子是:
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个可能的输入文件,但每个用户可能只想使用一个或两个。
答案 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)
}