如何在 shiny 中下载 editable 数据 table
How to download editable data table in shiny
在数据 table 中,我们可以使用参数 editable
生成 table editable。我正在制作一个闪亮的应用程序,其中 table 是 editable 和可下载的。
我的问题是如何下载数据table 在我编辑它之后?
这是我的应用程序代码:
library(shiny)
library(DT)
server <- function(input, output) {
df = iris
output$data = DT::renderDataTable ({
DT::datatable(df, editable = list(
target = 'row',
disable = list(columns = c(1, 3, 4))
))
})
output$downloadData <- downloadHandler(
filename = function() {
#paste(input$dataset, ".csv", sep = "")
},
content = function(file) {
write.csv(df, file, row.names = FALSE)
}
)
}
ui <- fluidPage(
DT::dataTableOutput('data'),
downloadButton("downloadData", "Download")
)
shinyApp(ui = ui, server = server)
可以直接在DT数据table上添加下载按钮,提供给用户下载table中的当前数据,见
但是,如果您希望将编辑后的数据用于 server-side 计算,那么您的方向是正确的,但需要将编辑后的 table 保存到 data.frame 中,使用 replaceData
。参见例如https://yihui.shinyapps.io/DT-edit/
当您编辑名为 "XXX" 的数据表的单元格时,有关单元格编辑的信息在 input$XXX_cell_edit
中。此信息包含已编辑单元格的索引及其新值。所以你可以这样做:
library(shiny)
library(DT)
dat <- iris[1:3, ]
ui <- fluidPage(
downloadButton("downloadData", "Download"),
DTOutput("table")
)
server <- function(input, output){
output[["table"]] <- renderDT({
datatable(dat, editable = "cell")
})
df <- reactiveVal(dat)
observeEvent(input[["table_cell_edit"]], {
cell <- input[["table_cell_edit"]]
newdf <- df()
newdf[cell$row, cell$col] <- cell$value
df(newdf)
})
output[["downloadData"]] <- downloadHandler(
filename = function() {
"mydata.csv"
},
content = function(file) {
write.csv(df(), file, row.names = FALSE)
}
)
}
shinyApp(ui, server)
或者,按照@MrGumble 的建议,您可以使用 Datatables 的嵌入式按钮而不是 downloadHandler
。这样更时尚
library(shiny)
library(DT)
dat <- iris[1:3, ]
ui <- fluidPage(
DTOutput("table")
)
server <- function(input, output){
output[["table"]] <- renderDT({
datatable(dat, editable = "cell", extensions = "Buttons",
options = list(
dom = "Bfrtip",
buttons = list(
"csv"
)
))
})
observeEvent(input[["table_cell_edit"]], {
cellinfo <- input[["table_cell_edit"]]
dat <<- editData(dat, input[["table_cell_edit"]], "table")
})
}
shinyApp(ui, server)
在数据 table 中,我们可以使用参数 editable
生成 table editable。我正在制作一个闪亮的应用程序,其中 table 是 editable 和可下载的。
我的问题是如何下载数据table 在我编辑它之后?
这是我的应用程序代码:
library(shiny)
library(DT)
server <- function(input, output) {
df = iris
output$data = DT::renderDataTable ({
DT::datatable(df, editable = list(
target = 'row',
disable = list(columns = c(1, 3, 4))
))
})
output$downloadData <- downloadHandler(
filename = function() {
#paste(input$dataset, ".csv", sep = "")
},
content = function(file) {
write.csv(df, file, row.names = FALSE)
}
)
}
ui <- fluidPage(
DT::dataTableOutput('data'),
downloadButton("downloadData", "Download")
)
shinyApp(ui = ui, server = server)
可以直接在DT数据table上添加下载按钮,提供给用户下载table中的当前数据,见
但是,如果您希望将编辑后的数据用于 server-side 计算,那么您的方向是正确的,但需要将编辑后的 table 保存到 data.frame 中,使用 replaceData
。参见例如https://yihui.shinyapps.io/DT-edit/
当您编辑名为 "XXX" 的数据表的单元格时,有关单元格编辑的信息在 input$XXX_cell_edit
中。此信息包含已编辑单元格的索引及其新值。所以你可以这样做:
library(shiny)
library(DT)
dat <- iris[1:3, ]
ui <- fluidPage(
downloadButton("downloadData", "Download"),
DTOutput("table")
)
server <- function(input, output){
output[["table"]] <- renderDT({
datatable(dat, editable = "cell")
})
df <- reactiveVal(dat)
observeEvent(input[["table_cell_edit"]], {
cell <- input[["table_cell_edit"]]
newdf <- df()
newdf[cell$row, cell$col] <- cell$value
df(newdf)
})
output[["downloadData"]] <- downloadHandler(
filename = function() {
"mydata.csv"
},
content = function(file) {
write.csv(df(), file, row.names = FALSE)
}
)
}
shinyApp(ui, server)
或者,按照@MrGumble 的建议,您可以使用 Datatables 的嵌入式按钮而不是 downloadHandler
。这样更时尚
library(shiny)
library(DT)
dat <- iris[1:3, ]
ui <- fluidPage(
DTOutput("table")
)
server <- function(input, output){
output[["table"]] <- renderDT({
datatable(dat, editable = "cell", extensions = "Buttons",
options = list(
dom = "Bfrtip",
buttons = list(
"csv"
)
))
})
observeEvent(input[["table_cell_edit"]], {
cellinfo <- input[["table_cell_edit"]]
dat <<- editData(dat, input[["table_cell_edit"]], "table")
})
}
shinyApp(ui, server)