用闪亮的应用程序在.csv中编写flatten data.frame

问题描述 投票:1回答:1

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

工作应用程序可以在这里访问:https://samtre.shinyapps.io/fichier_test/

当在“4 - Itemsàfacturer”中选择大于1的数字时,data.frame在“5-Entrezledétailtailchaque item”中生成。

这是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)

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

  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”是要写入的所有输入的列表。在那之后,我想写出我的flatten 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")

我已经坚持这个问题很长一段时间了。模仿谷歌形式的原始代码来自:qazxsw poi

虽然可以在这里找到创建data.frame的原始代码(Christopherlovell的回答):https://www.r-bloggers.com/mimicking-a-google-form-with-a-shiny-app/

谢谢!

r dataframe dynamic shiny export-to-csv
1个回答
0
投票

您好,您的问题是您使用Create dynamic number of input elements with R/Shiny语句创建data.frame。多数民众赞成你以后无法访问csv的方式。你想要的是将data.frame的构造放在像这样的反应式语句中

render

然后将render语句更改为这样的语句

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

我在saveData中你想要做什么不安全,但你可以使用output$item_tous <- renderTable({ item_tous_table() }, colnames = FALSE, bordered = TRUE, digits = 0) 访问data.frame

而且我认为你最好把csv的保存放在一个像这样的observeEvent中

item_tous_table()

而不是在一个功能。

希望这可以帮助!!

© www.soinside.com 2019 - 2024. All rights reserved.