问题描述
我有一个带有书签按钮和 ~/.bashrc
表的 Shiny 应用程序,允许用户编辑内容 (https://yuchenw.shinyapps.io/DT_Bookmark/)。但是,书签功能似乎无法记录DT表中编辑的内容。
这是一个例子。我将第一行的汽车名称更改为“Mazda RX4 aaaaa”,然后单击“书签按钮”。它可以生成一个 URL。但是当我将 URL 复制并粘贴到新浏览器时,它显示了应用程序的原始状态。
DT
解决方法
对数据表的最后修改在input$mDT_cell_edit
中注册。input$mDT_cell_edit
保存在书签状态,您可以使用 onRestore
恢复它。
但是,DT 中使用的完整数据不会保存:您可以使用 onBookmark
to save it too。
由于这超过了 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,rownames = T)
}
})
}
shinyApp(ui,server,enableBookmarking = "server")