Shiny App中DT表格无法显示的原因及解决方案
问题分析
根本原因是DT的前端依赖未加载:
- 初始状态下
dt被shinyjs::hidden()隐藏,且observeEvent默认忽略初始值(ignoreInit=TRUE),导致表格从未触发渲染,Shiny不会加载DT所需的JS/CSS资源。 - 当存在
dt2的DTOutput时,UI中的该组件会触发DT依赖加载,因此后续显示dt时表格能正常渲染。
解决方案
提供三种可行修改方式:
方式一:让observeEvent监听初始值
修改observeEvent参数,使其在App启动时就执行显示逻辑,触发表格渲染并加载依赖:
library(shiny) library(shinyjs) library(DT) ui <- fluidPage( useShinyjs(), "Bli", checkboxInput("ch","display datatable",value = TRUE), hidden(DTOutput("dt")), "Blob", "Blub" ) server <- function(input, output, session) { observeEvent(input$ch,{ if(input$ch){ show("dt") } else { hide("dt") } }, ignoreInit = FALSE) # 新增参数,监听初始值 output$dt <- renderDT(datatable(iris)) } shinyApp(ui, server)
方式二:手动预加载DT依赖
在UI中添加一个隐藏的空DT组件,强制加载DT的前端资源:
library(shiny) library(shinyjs) library(DT) ui <- fluidPage( useShinyjs(), "Bli", checkboxInput("ch","display datatable",value = TRUE), hidden(DTOutput("dt")), hidden(DTOutput("dummy_dt")), # 隐藏的dummy组件 "Blob", "Blub" ) server <- function(input, output, session) { observeEvent(input$ch,{ if(input$ch){ show("dt") } else { hide("dt") } }) output$dt <- renderDT(datatable(iris)) output$dummy_dt <- renderDT(datatable(data.frame())) # 空表格不影响界面 } shinyApp(ui, server)
方式三:用条件渲染替代shinyjs隐藏
直接用conditionalPanel根据复选框状态控制表格显示,无需额外依赖处理:
library(shiny) library(DT) ui <- fluidPage( "Bli", checkboxInput("ch","display datatable",value = TRUE), conditionalPanel(condition = "input.ch", DTOutput("dt")), "Blob", "Blub" ) server <- function(input, output, session) { output$dt <- renderDT(datatable(iris)) } shinyApp(ui, server)
内容的提问来源于stack exchange,提问作者Noskario
相关产品推荐
相关产品推荐

