我在管理我的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/
谢谢!
您好,您的问题是您使用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()
而不是在一个功能。
希望这可以帮助!!