2017-12-30 21 views
1

Ich habe ein Problem mit der Verwaltung eines dynamischen data.frame in meiner Shiny App erstellt. Problem ist, da es über den Server.R behandelt wird, kann ich keinen Weg finden, darauf zuzugreifen, es in einen Vektor flach zu machen und es dann nach meinen anderen Variablen zu schreiben (die alle Text/numerische Eingaben sind).Schreiben flatten data.frame in .csv von einer glänzenden App

Arbeiten App kann hier abgerufen werden: https://samtre.shinyapps.io/fichier_test/

Die data.frame in erzeugt wird - "- Artikel im facturer 4" "5 Entrez le détail de chaque Punkt", wenn eine Zahl größer als 1 bei der Auswahl.

Hier ist der Code in der server.R, die eine dynamische Anzahl von Eingängen Griffe erstellen:

output$item_des <- renderUI({ 
    numIndividuals <- as.integer(input$numIndividuals) 
    lapply(1:numIndividuals, function(i) { 
     textInput(inputId = paste0("item_des", i), label = paste("Description", i)) 
    }) 
    }) 
    output$item_qua <- renderUI({ 
    numIndividuals <- as.integer(input$numIndividuals) 
    lapply(1:numIndividuals, function(i) { 
     numericInput(inputId = paste0("item_qua", i), label = paste("Quantité", i), value = 1, min = 1) 
    }) 
    }) 
    output$item_pri <- renderUI({ 
    numIndividuals <- as.integer(input$numIndividuals) 
    lapply(1:numIndividuals, function(i) { 
     textInput(inputId = paste0("item_pri", i), label = paste("Prix", i)) 
    }) 
    }) 

Hier ist der Code in server.R, die die data.frame aus dem obigen schafft:

output$item_tous <- renderTable({ 
    num <- as.integer(input$numIndividuals) 

    data.frame(cbind(
    lapply(1:num, function(i) { 
     input[[paste0("item_des", i)]] 
    }), 
    lapply(1:num, function(i) { 
     input[[paste0("item_qua", i)]] 
    }), 
    lapply(1:num, function(i) { 
     input[[paste0("item_pri", i)]] 
    })   
)) 
    }, colnames = FALSE, bordered = TRUE, digits = 0) 

Und schließlich der Code in server.R, die die CSV schreibt:

formData <- reactive({ 
    data <- sapply(fieldsAll, function(x) input[[x]]) 
    data <- t(data) 
    data 
    }) 
    saveData <- function(data) { 
    fileName <- sprintf("%s.csv", 
         input$res_fac) 
    write.csv(x = data, file = file.path(responsesDir, fileName), 
       row.names = FALSE, quote = TRUE) 
    } 

Wo "fieldsAll" ist eine Liste aller zu schreibenden Eingaben. Es ist nach denjenigen, die Ich mag würde meinen Flatten data.frame schreiben:

fieldsAll <- c("per_nom", "per_tel", "per_dep", "fac_nom", "fac_adr", "res_dat", 
       "res_heu", "res_jou", "res_qua", "res_loc", "res_fac", "numIndividuals") 

Ich habe für eine lange Zeit auf diesem Problem stecken geblieben. Original-Code ein Google-Formular mimick ist aus: https://www.r-bloggers.com/mimicking-a-google-form-with-a-shiny-app/

Während Original-Code für die data.frame Erstellung finden Sie hier (Christopherlovell Antwort): Create dynamic number of input elements with R/Shiny

Dank!

Antwort

0

Hallo, dein Problem ist, dass du dein data.frame mit einem render Statement erstellst. So können Sie später für den CSV nicht darauf zugreifen. was Sie wollen, ist die Konstruktion des data.frame in einem reaktiven statment so etwas wie dieses

item_tous_table <- reactive({ 
    num <- as.integer(input$numIndividuals) 

    data.frame(cbind(
    lapply(1:num, function(i) { 
     input[[paste0("item_des", i)]] 
    }), 
    lapply(1:num, function(i) { 
     input[[paste0("item_qua", i)]] 
    }), 
    lapply(1:num, function(i) { 
     input[[paste0("item_pri", i)]] 
    })   
)) 
}) 

zu platzieren und dann machen statment etwas ändern wie diese

output$item_tous <- renderTable({ 
    item_tous_table() 
}, colnames = FALSE, bordered = TRUE, digits = 0) 

Ich bin unsicher, was Sie wollen in speichereDaten tun, aber Sie data.frame dort mit item_tous_table()

und auch besser ich glaube, Sie auch das Speichern der cSV-Platz in einem observeEvent so etwas wie diese

zugreifen können
observeEvent({ 
    input$submit 
},{ 
    fileName <- sprintf("%s.csv", 
         input$res_fac) 
    write.csv(x = formData() , file = file.path(responsesDir, fileName), 
      row.names = FALSE, quote = TRUE) 
}) 

eher dann in einer Funktion.

Hoffe das hilft !!

+0

Hallo Bertil, alles hat gut funktioniert! Vielen Dank. –

Verwandte Themen