r - 如何使用书签在 Shiny 的 DT 表中记录编辑的内容?
问题描述
我有一个带有书签按钮的闪亮应用程序和一个DT
允许用户编辑内容的表格(https://yuchenw.shinyapps.io/DT_Bookmark/)。但是,书签功能似乎无法记录 DT 表中的编辑内容。
这是一个例子。我将第一行的车名改为“Mazda RX4 aaaaa”,然后点击“书签按钮”。它可以生成一个 URL。但是当我将 URL 复制并粘贴到新浏览器时,它会显示应用程序的原始状态。
有没有办法让书签功能正常工作?这是代码。
library(shiny)
library(DT)
ui <- fluidPage(
titlePanel("Bookmark DT Example"),
sidebarLayout(
sidebarPanel(
bookmarkButton()
),
mainPanel(
DTOutput(outputId = "mDT")
)
)
)
server <- function(input, output){
rev <- reactiveValues(dat = mtcars)
output$mDT <- renderDT(
mtcars,
rownames = TRUE,
selection = "none",
editable = TRUE
)
dat_proxy <- dataTableProxy("mDT")
observeEvent(input$mDT_cell_edit, {
rev$dat <- editData(rev$dat, input$mDT_cell_edit, dat_proxy)
})
}
shinyApp(ui, server, enableBookmarking = "url")
解决方案
对数据表的最后修改注册在input$mDT_cell_edit
.
input$mDT_cell_edit
保存在书签状态,您可以使用onRestore
它来恢复它。
但是,在 DT 中使用的完整数据不会被保存:您也可以使用onBookmark
它来保存它。
由于这超过了 url 允许的 2000 个字符,您需要将书签存储在服务器上enableBookmarking = "server"
。
这就是在下面的代码中所做的,以展示前进的方式。当然,仅保存/恢复修改列表会更有效。
library(shiny)
library(DT)
server <- function(input, output){
rev <- reactiveValues(dat = mtcars)
output$mDT <- renderDT(
rev$dat,
rownames = TRUE,
selection = "none",
editable = TRUE
)
dat_proxy <- dataTableProxy("mDT")
observeEvent(input$mDT_cell_edit, {
info <- input$mDT_cell_edit
i <- info$row
j <- info$col
if (j>0) {
rev$dat[i, j] <<- DT::coerceValue(info$value, rev$dat[i, j])}
else {
row.names(rev$dat)[i] <- info$value
}
DT::replaceData(dat_proxy, rev$dat, resetPaging = FALSE, rownames = T)
})
onBookmark(function(state) {
state$values$rev_dat <- rev$dat
})
# restore table selection and search
onRestored(function(state) {
if (!identical(rev$dat,state$values$rev_dat)) {
rev$dat <- state$values$rev_dat
DT::replaceData(dat_proxy, state$values$rev_dat, resetPaging = FALSE, rownames = T)
}
})
}
shinyApp(ui, server, enableBookmarking = "server")
推荐阅读
- logstash - 在 Logstash 中转换多维数组
- javascript - Angular 7 使用 *ngfor 对数据进行分组
- linux - 如果第一个单元格的值满足条件,如何从 CSV 中删除一行?
- python - Python监控radiusd服务。负载均衡器 tcp 健康检查
- c++ - 公式与指定值不匹配的 C++ 结果
- javascript - 使用模板替换 https 链接
- javascript - 使用 jQuery 更改滑块的值
- sql-server - 使用插入器批量运行时临时表不下降
- python-3.x - 有什么方法可以更改 tkinter 中活动选项卡的颜色吗?
- php - 带有 CSRF 令牌的 Laravel API 请求