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

Posted

技术标签:

【中文标题】使用客户端处理(服务器 = F)在 Shiny 应用程序中进行 DT 编辑会引发 JSON 错误【英文标题】:DT Editing in Shiny application with client-side processing (server = F) throws JSON Error 【发布时间】:2019-03-02 07:53:00 【问题描述】:

我有一个 Shiny Server 应用程序,用户可以在其中编辑数据表,之后会相应地更新一些反应性摘要统计信息。我在一个相当慢的框架上托管这个应用程序,这就是为什么我想使用客户端处理进行 DT 渲染,即 server = F 传递给 DT::renderDataTable。让我分解一下我的问题的要点:

server = T 被传递时,代码完全可操作。

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

DataTables 警告:表 id=DataTables_Table_5 - JSON 无效 回复。有关此错误的更多信息,请参阅 http://datatables.net/tn/1

有趣的是,当这个错误窗口被关闭时,依赖的摘要统计信息会根据编辑正确更新,Shiny 应用程序会继续。因此,除了错误之外,一切正常。我应该注意,我访问了错误中提到的网站,却没有变得更聪明。

下面的可重现示例:

library(shiny)
library(DT)

dt = data.frame(V1 = c(1,2), V2 = c(3,4))

server <- function(input, output, session) 

val = reactiveValues(mat = data.table(dt))

output$testDT = renderDataTable(
            DT::datatable(val$mat, editable = TRUE)
, server = FALSE)

proxy = dataTableProxy('testDT')

observeEvent(input$testDT_cell_edit, 

  info = input$testDT_cell_edit

  str(info)

  i = info$row
  j = info$col
  v = info$val

  if (j == 1)

  val$mat$V1[i] = DT::coerceValue(v, val$mat$V1[i])
  replaceData(proxy, val$mat, rownames = FALSE)

  

)




ui <- fluidPage(
  dataTableOutput('testDT') 
)

shinyApp(ui, server)

谢谢!

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于使用客户端处理(服务器 = F)在 Shiny 应用程序中进行 DT 编辑会引发 JSON 错误的主要内容,如果未能解决你的问题,请参考以下文章

处理重定向时是不是应保留授权?

使用 Shiny 时如何检索客户端的当前时间和时区?

Selectizeinput 输入互斥 R Shiny

服务器或客户端在发送/接收日期时应该处理时区吗?

处理各种类型的 URL 重定向

在 Shiny 中替换列中的重复行