从 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)
})
而不是在函数中。
希望对您有所帮助!!
我在管理在我的 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()
而且我认为你最好将 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)
})
而不是在函数中。
希望对您有所帮助!!