在数据表中,我们可以使用参数editable
使该表可编辑。我正在制作一个闪亮的应用程序,其中的表可以编辑和下载。
我的问题是在编辑后 后如何下载数据表?
这是我的应用代码:
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)
答案 0 :(得分:1)
您可以直接在DT数据表中添加一个下载按钮,该按钮为用户提供了下载表中的当前数据的方法,请参见R Shiny: How to add download buttons in DT::renderDataTable
但是,如果您想使用编辑后的数据进行服务器端计算,那么您将走在正确的轨道上,但是需要使用replaceData
将编辑后的表保存到data.frame中。参见例如https://yihui.shinyapps.io/DT-edit/
答案 1 :(得分:1)
在编辑名为“ XXX”的数据表的单元格时,有关单元格编辑的信息位于3, 2, 2, 4, 2
中。该信息包含已编辑单元格的索引及其新值。因此,您可以这样做:
func Solution(N int, A []int) []int {
counters := make([]int, N)
var max int
var forcedVal int
for _, v := range A {
if v > N {
forcedVal = max
} else {
cur := counters[v-1]
if cur < forcedVal {
cur = forcedVal
}
cur++
if cur > max {
max = cur
}
counters[v-1] = cur
}
}
for i := range counters {
if counters[i] < forcedVal {
counters[i] = forcedVal
}
}
return counters
}
或者,按照@MrGumble的建议,您可以使用数据表的嵌入式按钮代替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)