2015-03-31 2 views
1

Я пытаюсь добавить функцию загрузки файлов в свое приложение Shiny. В идеале я хочу, чтобы пользователь мог загрузить файл csv, а затем выбрать переменную, которую они хотят использовать, из выпадающего меню. Когда приложение запускается, я изначально предварительно загрузил набор данных, и в раскрывающемся списке отображаются правильные имена переменных для этого набора данных. Однако, когда я пытаюсь загрузить другой файл csv, я не могу заставить раскрывающийся список обновить, чтобы отобразить переменные, содержащиеся в загруженном csv. Вот мой код:Обновление при загрузке файла Shiny R

server.R

library(shiny) 
library(ggplot2) 

inFile <- mtcars 

shinyServer(function(input, output) { 

    tableData <- reactive({ 
    inFile <<- input$file1 

    if (!is.null(inFile)){ 
     read.csv(inFile$datapath, header=input$header, sep=input$sep, 
                quote=input$quote) 
    } 
    else { 
     inFile <<- mtcars 
    } 
    }) 

    #for x values 
    output$opt.x <- renderUI({ 
     selectInput("xcolumn", "X column to Plot", names(inFile)) 
    }) 
}) 

ui.R

library(shiny) 

shinyUI(fluidPage(
    titlePanel("App"), 
     sidebarLayout(
      sidebarPanel(
       fileInput('file1', 'Choose CSV File', 
        accept = c(
          '.csv', 
          '.tsv') 
       ), 
       uiOutput("opt.x") 
      ), 
    mainPanel() 
)) 

Я также попытался поместить выход $ назначение opt.x внутри реактивной функции, читается в файле, но это, похоже, не помогло.

+0

На самом деле, я неправильно понял вопрос, щедрость, которую я намеревался, была для того, чтобы повторно загрузить тот же файл, используя блестящий. –

ответ

3

Привет не проходят переменную глобальной Environnement, используйте блестящую реактивную функцию вместо того, чтобы ваш сервер должен быть:

library(shiny) 
library(ggplot2) 

# Test data 
# write.csv(x = iris, file = "iris.csv", row.names = FALSE) 
# write.csv(x = data.frame(V1 = 1:10, V2 = rnorm(10)), file = "test.csv", row.names = FALSE) 

shinyServer(function(input, output) { 

    tableData <- reactive({ 
    inFile <- input$file1 

    if (!is.null(inFile)){ 
     read.csv(inFile$datapath) 
    } else { 
     mtcars 
    } 
    }) 

    #for x values 
    output$opt.x <- renderUI({ 
    selectInput("xcolumn", "X column to Plot", names(tableData())) 
    }) 

output$your_data <- renderTable({ 
    head(tableData()) 
}) 
}) 

И заменить основную панель с:

mainPanel(
    tableOutput("your_data") 
) 

Я удалить params в read.csv, поскольку эти входные данные не определены в пользовательском интерфейсе.

EDIT

Попробуйте это приложение, это не блестящее решение, но JQuery/JS один (разница в пользовательском интерфейсе) (см this answer):

library("shiny") 
ui <- fluidPage(
    titlePanel("App"), 
    sidebarLayout(
    sidebarPanel(
     fileInput('file1', 'Choose CSV File', 
       accept = c('.csv','.tsv') 
    ), 
     tags$script(
     '$("#file1").on("click", function() { 
      this.value = null; 
     });' 
    ), 
     uiOutput("opt.x") 
    ), 
    mainPanel(
     tableOutput("your_data") 
    ) 
    ) 
) 
server <- function(input, output) { 

    tableData <- reactive({ 
    inFile <- input$file1 
    if (!is.null(inFile)){ 
     read.csv(inFile$datapath) 
    } else { 
     mtcars 
    } 
    }) 
    #for x values 
    output$opt.x <- renderUI({ 
    selectInput("xcolumn", "X column to Plot", names(tableData())) 
    }) 

    output$your_data <- renderTable({ 
    head(tableData()) 
    }) 
} 
shinyApp(ui = ui, server = server) 

Для тестирования я использовал :

write.csv(x = data.frame(V1 = 1:10, V2 = rnorm(10)), file = "test.csv", row.names = FALSE) 
write.csv(x = data.frame(V11 = 11:20, V12 = rnorm(10), ABC = letters[1:10]), file = "test.csv", row.names = FALSE) 
+0

Я предложил щедрость, однако у меня все еще есть проблема. Как вы повторно загрузите тот же файл? Я не вижу блеска, позволяя вам загружать один и тот же файл более одного раза (даже если файл изменен локально) –

+1

Хорошо, я понимаю, посмотрю, какое изменение я сделал для своего ответа – Victorp

+0

Я получаю «максимальный размер выгрузки» для умеренных большие файлы. Что такое ограничение? И может ли это быть изменено? – Antex

Смежные вопросы