[英]How to discard user edits on DT::datatable in Shiny R
我使用 DT::renderDataTable 为 Shiny 应用程序呈现 data.table,并在datatable()
的定义中使用editable = TRUE
。 datatable
的data
参数是一个反应式表达式,它根据从下拉菜单中选择的值从数据库中获取数据。 我希望能够有一个按钮来刷新数据表并放弃任何用户编辑,就像从下拉菜单中选择另一个值一样。 我无法为您提供可重现的示例,因为我使用的是专有代码和来自数据库的数据。 我知道我可以在刷新按钮单击事件上使用observeEvent
,然后调用表的渲染 function,但我正在寻找一种更优雅的方法。 谢谢
发现您可以使用proxy <- datatableProxy()
,然后在刷新按钮的watchEvent内部使用reloadData(proxy)
。 这将取消对数据表所做的任何编辑。
谢谢@Stelios!
这是改编自https://github.com/rstudio/DT/issues/357#issuecomment-247423310的代表
library(shiny)
shinyApp(
ui = fluidPage(
fluidRow(
column(2, actionButton('refresh', 'Refresh Data', icon = icon('refresh'))),
column(10, DT::dataTableOutput('foo'))
)
),
server = function(input, output, session) {
output$foo = DT::renderDataTable(
iris,
selection = 'none',
editable = 'all',
caption = 'Double-click to edit cells. Press Ctrl+Enter to save changes.'
)
proxy = dataTableProxy('foo')
observeEvent(input$refresh, {
DT::reloadData(proxy)
})
}
)
而且,本着上述帖子的精神,它适用于模块。
library(shiny)
edit_dt_ui <- function(id) {
tagList(
fluidRow(
column(2, actionButton(NS(id, 'refresh'), 'Refresh Data', icon = icon('refresh'))),
column(10, DT::dataTableOutput(NS(id, 'foo')))
)
)
}
edit_dt_server <- function(id) {
moduleServer(id, function(input, output, session) {
output$foo <- DT::renderDataTable(
iris,
selection = 'none',
editable = 'all',
caption = 'Double-click to edit cells. Press Ctrl+Enter to save changes.'
)
proxy <- dataTableProxy('foo')
observeEvent(input$refresh, {
DT::reloadData(proxy)
})
})
}
ui <- fluidPage(
edit_dt_ui('dt')
)
server <- function(input, output, session) {
edit_dt_server('dt')
}
shinyApp(ui, server)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.