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