有一个闪亮的应用程序看起来像这样:
library(shiny) library(DT) shinyApp( ui = fluidPage( sidebarLayout( sidebarPanel( numericInput( inputId = "random_val",label = "pick random value",value = 1 ) ),mainPanel( tabsetPanel( id = "tabset",tabPanel( title = "some_other_tab","Some other stuff" ),tabPanel( title = "test_render",textOutput("echo_test"),DTOutput("dt_test") ) ) ) ) ),server = function(input,output) { output$echo_test <- renderText({ cat("renderText called \n") input$random_val }) outputOptions(output,"echo_test",suspendWhenHidden = FALSE) output$dt_test <- renderDT({ cat("renderDT called \n") df <- data.frame( a = 1:10^6,b = rep(input$random_val,10^6) ) datatable(df) }) outputOptions(output,"dt_test",suspendWhenHidden = FALSE) } )
我的问题如下:当输入(输入$random_value)更改而选项卡test_render(即带有DT的选项卡)打开时,一切正常.但是,当用户更改其输入时,包含DT的选项卡未处于活动状态时,即使设置了suspendWhenHidden = FALSE并且似乎调用了renderDT,DT也不会更新.
我发现一个open issue抱怨类似的问题,但没有提供解决方案.
我也找到了这个question,并试图使它适应我的问题.到目前为止,我通过运行$(“#dt_test table”)来更新DT成功.DataTable().draw();从浏览器控制台. DT在点击时也会更新(例如,在排序按钮上).
我正在寻找一种方法来在输入更改(或其初始化)时立即更新DT,无论它是否在活动面板上.特别麻烦的一个特殊情况是应用程序启动时 – DT不会立即呈现.看来图纸只在它所在的标签打开时开始(它显示处理…).在我的实际应用程序中,这会引入几秒滞后 – 这就是为什么我想在用户查看其他选项卡时强制处理DT的原因.
我试验了包含运行$(“#dt_test table”)的javascript文件.DataTable().draw();各种events,但到目前为止没有成功.
有没有办法通过上述事件或任何其他方法实现我正在寻找的东西?
解决方法
>通过使用观察者,但使用此解决方案时,表将在切换到数据表选项卡时更新,而不是之前.
这是受两个视频的启发,这些视频非常有助于更好地理解闪亮的效果:
Shiny developer conference 2016 – 第一个列出的两个视频
>通过使用代理对象,此选项需要通过在呈现表时设置适当的选项来进行服务器端处理(请参阅下面的此解决方案的代码)
解决方案1
library(shiny) library(DT) shinyApp( ui = fluidPage( sidebarLayout( sidebarPanel( numericInput( inputId = "random_val",value = 1 ) ),mainPanel( tabsetPanel( id = "tabset",tabPanel( title = "some_other_tab","Some other stuff" ),tabPanel( title = "test_render",DTOutput("dt_test") ) ) ) ) ),output) { output$echo_test <- renderText({ cat("renderText called \n") input$random_val }) outputOptions(output,suspendWhenHidden = FALSE) observeEvent(input$random_val,{ cat("renderDT called \n") df <- data.frame( a = 1:10^6,10^6) ) output$dt_test <- renderDT(df) }) } )
解决方案2
library(shiny) library(DT) shinyApp( ui = fluidPage( sidebarLayout( sidebarPanel( numericInput( inputId = "random_val",selected = "test_render",output,session) { output$echo_test <- renderText({ cat("renderText called \n") input$random_val }) outputOptions(output,suspendWhenHidden = FALSE) output$dt_test <- renderDT({ cat("renderDT called \n") df <- data.frame( a = 1:10^6,b = rep(1,10^6) ) datatable(df) },server = TRUE) observeEvent(input$random_val,{ df <- data.frame( a = 1:10^6,10^6) ) dt_test_proxy <- dataTableProxy("dt_test",session = shiny::getDefaultReactiveDomain(),deferUntilFlush = TRUE) replaceData(dt_test_proxy,df) cat("table updated \n") }) updateTabsetPanel(session,"tabset",selected = "some_other_tab") } )
如果这有帮助,请告诉我….