从 Shiny 应用程序在 .csv 中写入 flatten data.frame

Writing flatten data.frame in .csv from a Shiny app

我在管理在我的 Shiny 应用程序中创建的动态 data.frame 时遇到问题。问题是,因为它是通过 server.R 处理的,所以我找不到访问它的方法,将它展平成一个向量,然后将它写在我的其他变量(都是 text/numeric 输入)之后。

可在此处访问工作应用程序:https://samtre.shinyapps.io/fichier_test/

在“5 - Entrez le détail de chaque item”中,当在“4 - Items à facturer”中选择大于 1 的数字时,会生成 data.frame。

这是 server.R 中处理创建动态输入数量的代码:

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

这是 server.R 中的代码,它从上面创建 data.frame :

  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)

最后是 server.R 中写入 .csv 的代码:

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

其中 "fieldsAll" 是要写入的所有输入的列表。在那些之后我想写我的展平 data.frame :

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")

我在这个问题上卡了很久。模仿 google 形式的原始代码来自:https://www.r-bloggers.com/mimicking-a-google-form-with-a-shiny-app/

虽然可以在此处找到创建 data.frame 的原始代码(Christopherlovell 的回答):Create dynamic number of input elements with R/Shiny

谢谢!

您好,您的问题是您在 render 语句中创建 data.frame。这样你以后就不能访问它来获取 csv 了。你想要的是将 data.frame 的构造放在像这样的反应式语句中

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

然后将渲染语句更改为类似这样的内容

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

我不确定你想在 saveData 中做什么,但你也可以通过 item_tous_table()

访问 data.frame

而且我认为你最好将 csv 的保存放在类似这样的 observeEvent 中

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

而不是在函数中。

希望对您有所帮助!!