2017-10-04 3 views
1

Je souhaite créer plusieurs fonctions FileInput pour permettre aux utilisateurs de télécharger des fichiers. La principale raison pour laquelle je crée plusieurs widgets de téléchargement est parce que je veux permettre aux utilisateurs de télécharger via un chemin différent. Ce que j'essaie d'accomplir ici est de faire une boucle sur toutes les entrées de fichiers et de sauvegarder tous les fichiers dans une seule image, mais je ne peux pas le faire dans l'exemple de mon code.Comment faire défiler plusieurs widgets de téléchargement en brillant?

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

oublié le début du code que j'ai n_attachments <- sprintf ("fichier% s", seq (1: 2)) – MC1277

+0

S'il vous plaît modifier et mettre à jour votre message avec le nouveau code. – jsb

Répondre

0

ok je pense que j'ai tout compris, je dois utiliser l'entrée [[x]] au lieu de l'entrée $ x, et j'ai ajouté des lignes de couple pour vérifier le nombre fileinputs sont téléchargés.

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)