Shiny应用中如何检测页面DT表格是否存在并输出对应状态值
Shiny应用检测DT表格渲染状态实现方案
该需求完全可以实现,以下提供两种常用实现方案:
方案1:前端监听渲染事件(状态最精准)
该方案通过JavaScript监听页面端DT的实际渲染/销毁事件,回传状态到服务端,能准确反映用户可见的表格是否真实存在。
完整示例代码如下:
library(shiny) library(DT) ui <- fluidPage( DTOutput("tab"), textOutput("table_status"), # 注入JavaScript监听事件 tags$script(HTML(" // 监听DT渲染完成事件 $(document).on('shiny:value', function(event) { if (event.name === 'tab') { Shiny.setInputValue('dt_rendered', 1); } }); // 监听DT销毁事件 $(document).on('shiny:unbound', function(event) { if (event.target.id === 'tab') { Shiny.setInputValue('dt_rendered', 0); } }); ")) ) server <- function(input, output, session) { dt_status <- reactiveVal(0) # 同步前端回传的状态 observeEvent(input$dt_rendered, { dt_status(input$dt_rendered) }) output$tab <- renderDT({ datatable(iris) }) # 输出状态值 output$table_status <- renderText({ dt_status() }) } shinyApp(ui, server)
方案2:服务端直接检测(实现最简)
如果只需要判断服务端是否完成了表格的render逻辑,不需要感知前端实际渲染结果,可以用更简单的服务端检测方法,无需引入JS:
library(shiny) library(DT) ui <- fluidPage( DTOutput("tab"), textOutput("table_status") ) server <- function(input, output, session) { output$tab <- renderDT({ datatable(iris) }) output$table_status <- renderText({ # 检测output是否已执行渲染 if (outputOptions(output, "tab", "executed")) 1 else 0 }) } shinyApp(ui, server)
内容的提问来源于stack exchange,提问作者mapvin vin
相关产品推荐
相关产品推荐

