首页 > 解决方案 > 将 ID 应用于 taglist 中的 renderDT()

问题描述

我有一个在一个巨大的函数中创建的动态界面。该函数还输出一个包含所有输入功能和其他内容的标记列表。其中有一个 DT 表。这一切都很好,工作正常。现在我希望能够在 DT 中替换 Data(),但是在创建 taglist 时,我可以为 datatable() 分配一个 elementID,但 renderDT 会覆盖它。

如果我省略了 renderDT() 表仍然显示,但 replaceData() 失败并显示

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

错误信息。

当前有效但非常糟糕的解决方案:如果我有 renderDT(),则会创建一些以“out”开头的散列 ID。这可以在observe() 中捕获并用于创建datatableProxy() 对象,然后该对象可用于replaceData()。这样做的一个问题是你只能有一个表,这很糟糕。

DT git 上已经存在问题:https ://github.com/rstudio/DT/issues/567但没有解决方案。

library(shiny)

ui <- fluidPage(

 uiOutput("inputs")

)

server <- function(input, output, session) {

  output$inputs <- renderUI({
    tagList( h1("a table has no id")
            ,renderDT(datatable(mtcars,elementId = "thisDoesHaveAnID"))
            ,actionButton("replaceDataGo","Replace data go!")
            )
  })

  observeEvent(input$replaceDataGo,{
    tableid <- gsub("_.*","",names(input)[grep("out.*",names(input))][1])
    tableProxy <- dataTableProxy(tableid,session = session)
    replaceData(tableProxy,mtcars[1:input$replaceDataGo,])
  })

}

shinyApp(ui, server)

是否有任何方法将标签列表中可能已经存在的 ID 应用于此渲染?

标签: rshinydt

解决方案


推荐阅读