Shiny如何使用书签将编辑的内容记录在一个DTtable中?

How to use bookmark to document the edited contents in a DT table in Shiny?

我有一个带有书签按钮和 DT table 的 Shiny 应用程序,允许用户编辑内容 (https://yuchenw.shinyapps.io/DT_Bookmark/)。但是,书签功能似乎无法记录DT table.

中编辑的内容

这是一个例子。我将第一行的车名改为“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 to save it too.
由于这超出了 url 允许的 2000 个字符,您需要使用 enableBookmarking = "server".

将书签存储在服务器上

这是在下面的代码中完成的,以显示前进的方式。当然,仅 save/restore 修改列表会更有效率。

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")