我有一个Shiny Server应用程序,用户可以在其中编辑数据表,然后该表的一些相关摘要统计信息将相应地更新。我将这个应用程序托管在一个相当慢的框架上,这就是为什么我想使用客户端处理DT渲染(服务器= F传递给DT :: renderDataTable的原因)。让我分解一下我的问题的要点:
当 Server = T 作为arg传递时,代码完全可操作。
在传递 Server = F 时,当用户在DT中编辑单元格时,浏览器会抛出以下错误消息:
书面:
DataTables警告:table id = DataTables_Table_5-无效的JSON响应。有关此错误的更多信息,请参见http://datatables.net/tn/1
一个有趣的事情是,当关闭此错误窗口时,从属摘要统计信息会根据编辑正确更新,并且Shiny应用会继续。因此,除错误外,其他所有操作均有效。我应该注意,我访问了错误所涉及的站点,而没有变得更明智。
以下SO线程解决了此问题(未解决)。我想在将这个(可能的错误?)带到Git页面之前,我将提交完整的SO线程。
考虑到该应用程序可运行,我认为这没有多大帮助,但是我的代码附在下面;
server.R:
output$alloc_table = DT::renderDataTable({
DT::datatable(dt,
options=list(pageLength=10, autowidth = TRUE),
editable = T,
selection = list(mode = 'none')) %>%
}, server = FALSE)
alloc_table_proxy = DT::dataTableProxy('alloc_table')
observeEvent(input$alloc_table_cell_edit, {
info = input$alloc_table_cell_edit
str(info)
i = info$row
j = info$col
v = info$value
if (j == 7){
container$rendered$Allocation[i] = DT::coerceValue(v, container$rendered$Allocation[i])
replaceData(alloc_table_proxy, container$rendered, rownames = FALSE)
}
})
谢谢!
编辑:我的Github Issue线程中的可复制代码: https://github.com/rstudio/DT/issues/598
答案 0 :(得分:3)
在the Github thread上已经回答了,我在这里分享我的答案。
可能没有明确记录。它与编辑无关。这是因为
replaceData()
调用reloadData()
,这需要服务器端处理模式。参见?reloadData()
。reloadData()仅适用于服务器端处理模式下的表,例如用renderDataTable(server = TRUE)呈现的表。要重新加载的数据(即传递给dataTableAjax()的数据)必须与表中的上一个数据对象具有完全相同的列数。