2017-10-04 25 views
1

我想创建多个fileInput函数来允许用户上传文件。我创建多个上传小部件的主要原因是因为我想让用户通过不同的路径上传。我在这里想要完成的是循环遍历所有的fileInputs并将所有文件保存到一个数据框中,但无法在我的代码中执行。如何通过闪亮循环多个上传宽度?

library(shiny) 
library(data.table) 
library(DT) 

n_attachments <- sprintf("file%s",seq(1:2))  
ui <- fluidPage(
    titlePanel('File download'), 
    sidebarLayout(
    sidebarPanel(
     textInput("LOAN_NUMBER", label = "Fannie Mae Loan Number", placeholder = "Please enter loan #") 
     , textInput("REO_ID", label = "REO Number", placeholder = "Please enter REO #") 
     , fileInput("file1", "Attachments1", accept = c("text/csv", "text/comma-separated-values,text/plain",".csv", ".pdf", ".doc", ".xlsx"), multiple = TRUE) 
     , fileInput("file2", "Attachments2", accept = c("text/csv", "text/comma-separated-values,text/plain",".csv", ".pdf", ".doc", ".xlsx"), multiple = TRUE) 
     , textOutput('text') 
    ), 
    mainPanel(
     DT::dataTableOutput("table"), tags$hr() 
    ) 
) 
) 


server <- function(input, output) { 

    bin_data <- reactive({ 

    attachement_data <- data.frame(ATTACHMENT = character(), FILENAME = character(), LOAN_NUMBER = character(), REO_ID = character()) 

    for(x in n_attachments) 
    { 
     output$text <- renderText({ input$x }) 
     req(input$x) 
     #  binary_data <- paste(readBin(input$file1$datapath, what="raw", n=1e6), collapse="-") 
     #  attachment_info <- data.frame(ATTACHMENT = binary_data, FILENAME = paste0(input$file1$name)) 
     #  attachment_info 
     binary_data=list() 
     filenames=list() 

     for(i in 1:length(input$x[,1])){ 
     binary_data[[i]] <- paste(readBin(input$x[[i, 'datapath']], what = "raw", n=1e6), collapse = "-") 
     filenames[[i]] <- input$x[[i, 'name']] 
     } 
     bin_data_frame <- data.frame(ATTACHMENT = as.character(unlist(binary_data)), FILENAME = as.character(unlist(filenames))) 
     bin_data_frame$LOAN_NUMBER <- input$LOAN_NUMBER 
     bin_data_frame$REO_ID <- input$REO_ID 
     attachement_data <- rbind(attachement_data, bin_data_frame) 
    } 
    save(attachement_data, file="attachement_data.RData") 
    attachement_data 
    }) 

    output$table <- DT::renderDataTable({ 
    bin_data() 
    }) 
} 

shinyApp(ui = ui, server = server) 
+0

忘记开头的代码我有n_attachments < - sprintf的( “文件%s”,SEQ(1:2)) – MC1277

+0

请编辑和更新使用新代码您的文章。 – jsb

回答

0

确定我想我想通了,我必须用输入[[X],而不是输入$ x和我添加几行检查多少fileinputs上传。

server <- function(input, output) { 

    bin_data <- reactive({ 

    attachement_data <- data.frame(ATTACHMENT = character(), FILENAME = character(), LOAN_NUMBER = character(), REO_ID = character()) 

    k <- 0 
    for(x in n_attachments) 
    { 
     if(!is.null(input[[x]])) 
     { 
     k = k + 1 
     } 
    } 

    for(x in n_attachments[0:k]) 
    { 
     if(!is.null(input[[x]])) 
     { 
     output$text <- renderText({ input[[x]] }) 
     req(input[[x]]) 
     #  binary_data <- paste(readBin(input$file1$datapath, what="raw", n=1e6), collapse="-") 
     #  attachment_info <- data.frame(ATTACHMENT = binary_data, FILENAME = paste0(input$file1$name)) 
     #  attachment_info 
     binary_data=list() 
     filenames=list() 

     for(i in 1:length(input[[x]][,1])){ 
     binary_data[[i]] <- paste(readBin(input[[x]][[i, 'datapath']], what = "raw", n=1e6), collapse = "-") 
     filenames[[i]] <- input[[x]][[i, 'name']] 
     } 
     bin_data_frame <- data.frame(ATTACHMENT = as.character(unlist(binary_data)), FILENAME = as.character(unlist(filenames))) 
     bin_data_frame$LOAN_NUMBER <- input$LOAN_NUMBER 
     bin_data_frame$REO_ID <- input$REO_ID 
     attachement_data <- rbind(attachement_data, bin_data_frame) 
     } 
    } 
    save(attachement_data, file="attachement_data.RData") 
    attachement_data 
    }) 

    output$table <- DT::renderDataTable({ 
    bin_data() 
    }) 
} 

shinyApp(ui = ui, server = server)