首页 > 解决方案 > 如何使用书签在 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")

标签: rshinydtrshiny

解决方案


对数据表的最后修改注册在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")

推荐阅读