2016-08-28 99 views
0

我有一個閃亮的應用程序,需要從幾個文件之一的輸入。一個簡單的例子是:避免重新加載數據集中的反應閃亮

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

})) 

在現實中,我讀出的文件大很多,所以我想以避免讀到他們每次輸入$數據的變化,如果它已經做了一次。例如,通過使矩陣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

你可以做類似

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

@sigmabeta

感謝您的建議。不幸的是,它似乎不適合我。當我編輯服務器:

myData <- reactive({ 
    data <- fetch_data(input$data) 
    data 
}) 
fetch_data <- function(input) { 
    if (!exists(paste0("mat_", input))) { 
     print(paste("Loading", input)) 
     inFile <- paste0("test_", input, ".csv") 
     data <- read.csv(inFile, header=TRUE) 
     assign(paste0("mat_", input), data) 
    } else if (exists(paste0("mat_", input))) { 
     print(paste0("mat_", input, " already available")) 
     data <- paste0("mat_", input) 
    } 
    return (data) 
} 
output$contents <- renderTable({ 
    myData() 
}) 

打印報表顯示,它一直讀取數據,而不是它在環境中可用。 '分配'似乎仍然只能在本地工作。

+0

剛剛發現我可以將加載的對象放入reactiveValues()中。這不是優雅,但它似乎工作。 –