为何Shiny中input$tableId_rows_selected加载时触发两次?
为何Shiny中DT表格的input$table_rows_selected在首次加载时触发两次?
我并非寻求解决方案,而是想得到原因解释。有人知道为何在以下示例中,input$tableId_rows_selected在页面首次加载时会触发两次吗?我已找到解决方案,但无法理解其触发两次的原因。
代码示例
library(shiny) library(DT) ui <- fluidPage( DTOutput("table") ) server <- function(input, output, session) { output$table <- renderDT(iris) observe({ print(input$table_rows_selected) }) } shinyApp(ui, server)
页面首次加载时控制台输出
NULL NULL
原因解释
这是因为DT表格的初始化流程分为两个阶段,都会触发input$table_rows_selected的更新:
- 第一阶段:Shiny服务器端先完成DT表格的基础渲染,此时前端的DT组件还没完成JS初始化,
input$table_rows_selected被初始化为NULL,触发一次observe。 - 第二阶段:前端DT组件完成JS层面的初始化后,会主动向服务器同步当前的选中状态——由于此时没有任何行被选中,所以依然传递
NULL,这就导致observe被第二次触发。
本质上就是服务器端渲染和前端JS初始化这两个步骤,各自同步了一次“无选中行”的状态,所以会出现两次NULL输出。
内容的提问来源于stack exchange,提问作者guasi
相关产品推荐
相关产品推荐

