Shiny 将checkBoxGroup写入文件并从中读取

Shiny 将checkBoxGroup写入文件并从中读取,shiny,Shiny,我创建了一个闪亮的应用程序,其中包括一个checkBoxGroup。调用时,此元素返回一个包含选定选项的向量。我可以使用write.table()将其写入文件,并创建一个CSV文件,其中一行如下所示: Jota 5 5 nature3 5 5 FALSE c("choice1", "choice2", "choice4") property c("choiceA", "choiceB", "ChoiceD", "choiceE", "choiceK") 5 5 "name","groupIn

我创建了一个闪亮的应用程序,其中包括一个
checkBoxGroup
。调用时,此元素返回一个包含选定选项的向量。我可以使用
write.table()
将其写入文件,并创建一个CSV文件,其中一行如下所示:

Jota 5 5 nature3 5 5 FALSE c("choice1", "choice2", "choice4") property c("choiceA", "choiceB", "ChoiceD", "choiceE", "choiceK") 5 5
 "name","groupInput"
 somename,c("abc", "def", "ghi")
但是使用
read.table()
将此文件读回似乎很棘手,因为它会返回

扫描错误(文件=文件,内容=内容,sep=sep,quote=quote,dec=dec,: 第9行没有12个参数

我假设
read.table()
很难解析CSV文件中的向量。除了将结构展平并将每个选项转换为具有唯一列的单独真/假值之外,还有其他解决方法吗

编辑:示例应用程序 正如建议的那样,我创建了一个虚拟应用程序,它复制了这个问题。它是由Shinny在此基础上构建的。与上面描述的不同,它使用
write.csv()
并为每个表单提交创建一个新文件,但问题是相同的

library(shiny)

fields <- c("name", "groupInput")

shinyApp(
  ui = fluidPage(
    textInput("name", "Name", ""),
    checkboxGroupInput("groupInput", "Select from list", choices = c('abc', 'def', 'ghi')),
    actionButton("submit", "Submit"),
    DT::dataTableOutput("responses", width = 300)
  ),
  server = function(input, output, session) {

    formData <- reactive({
      data <- sapply(fields, function(x) input[[x]])
      data
    })

    observeEvent(input$submit, {
      saveData(formData())
    })

    output$responses <- DT::renderDataTable({
      input$submit
      loadData()
    })   

    outputDir <- "responses"

    saveData <- function(data) {
      data <- t(data)
      # Create a unique file name
      fileName <- sprintf("%s_%s.csv", as.integer(Sys.time()), digest::digest(data))
      # Write the file to the local system
      write.csv(
        x = data,
        file = file.path(outputDir, fileName),
        row.names = FALSE, quote = TRUE
      )
    }

    loadData <- function() {
      # Read all the files into a list
      files <- list.files(outputDir, full.names = TRUE)
      data <- lapply(files, read.csv, stringsAsFactors = FALSE) 
      # Concatenate all data together into one data.frame
      data <- do.call(rbind, data)
      data
    }
  }
)
CSV中存在向量似乎会导致
read.CSV
中出现错误,即:

Warning: Error in read.table: more columns than column names
Stack trace (innermost first):
    87: read.table
    86: FUN
    85: lapply
    84: loadData [/Users/alexanderjulmer/Code/test-storage/app.R#45]
    83: exprFunc [/Users/alexanderjulmer/Code/test-storage/app.R#25]
    82: widgetFunc
    81: func
    80: origRenderFunc
    79: renderFunc
    78: origRenderFunc
    77: output$responses
     1: runApp

我认为这是因为向量在data.frame中没有正确解析,我怀疑这是可能的。因此我认为最好将
checkBoxGroup
中的数据拆分为几列。但是,如何做到这一点呢?

听起来你试图避免的是为每个可能的
checkBoxGrou单独设置一列p
input-我看到的替代方法是将它们的任意组合视为长度为1的元素,这样就可以通过
read.csv
读取。在您的示例应用程序中,如果选中多个,则检查是长度为3的列表,可以理解read.csv并不真正知道如何处理

为了解决这个问题,我的方法是首先取消列出
checkBoxGroup
的元素,然后将元素折叠成一个字符向量,并将其粘贴到“Name”文本输入中。所有这些都是在分配给
formData
时完成的:

formData <- reactive({
  data <- sapply(fields, function(x) input[[x]])
  chks <- unlist(data[[2]])
  data <- c(data[[1]], paste0(chks, collapse=", "))
  data
})

formData您能否提供您的
write.table()
调用,并可能描述您希望从读回的文件中获得什么行为(或者更好的是,创建一个简单的工作应用程序来演示问题)?如果您想写入CSV,我认为解决方法是将您的checkBoxGroup输入作为单个字符串处理。但从问题的另一端看,这是否对您有用还不清楚。我希望我添加了一个示例来澄清我的问题。我认为问题是,
checkBoxGroup
返回一个向量在储存前需要特殊处理。