如何在 Shiny 中使用书签记录 DT 表中编辑的内容?

问题描述

我有一个带有书签按钮和 ~/.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")

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...