使用客户端处理(服务器= F)在Shiny应用程序中进行DT编辑会引发JSON错误

时间:2018-09-26 13:51:56

标签: r json shiny shiny-server dt

我有一个Shiny Server应用程序,用户可以在其中编辑数据表,然后该表的一些相关摘要统计信息将相应地更新。我将这个应用程序托管在一个相当慢的框架上,这就是为什么我想使用客户端处理DT渲染(服务器= F传递给DT :: renderDataTable的原因)。让我分解一下我的问题的要点:

  • Server = T 作为arg传递时,代码完全可操作。

  • 在传递 Server = F 时,当用户在DT中编辑单元格时,浏览器会抛出以下错误消息:

Error Message

书面:

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

1 个答案:

答案 0 :(得分:3)

the Github thread上已经回答了,我在这里分享我的答案。

  

可能没有明确记录。它与编辑无关。这是因为replaceData()调用reloadData(),这需要服务器端处理模式。参见?reloadData()

     
    

reloadData()仅适用于服务器端处理模式下的表,例如用renderDataTable(server = TRUE)呈现的表。要重新加载的数据(即传递给dataTableAjax()的数据)必须与表中的上一个数据对象具有完全相同的列数。