javascript – Shiny:在非活动tabPanel上更新DT

前端之家收集整理的这篇文章主要介绍了javascript – Shiny:在非活动tabPanel上更新DT前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
TL; DR:如何在非活动选项卡上强制绘制数据表但其输入更改?

有一个闪亮的应用程序看起来像这样:

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")
            }
    )

如果这有帮助,请告诉我….

猜你在找的JavaScript相关文章