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
返回一个向量在储存前需要特殊处理。