【问题标题】:Keep pagination beetween tabs in Shiny datatables在 Shiny 数据表中的选项卡之间保持分页
【发布时间】:2017-05-11 09:13:00
【问题描述】:

我在 tabsetpanel 中呈现了三个数据表,我需要做的是将一个数据表的当前页面保留到其他数据表中。例如,如果我在 datatable1 的第 1 页,然后转到第 2 页,我希望 datatable2 和 3 在第 2 页。

这是我的代码,有什么想法吗?

shinyApp(
    ui = fluidPage(
      tags$head(
        # hides the default search functionality
        tags$style(
          HTML(".dataTables_filter, .dataTables_info { display: none; }")
        )
      ),
      fluidRow(
        column(10, 
               ""
        ), 
        column(2,              
               uiOutput("pageFilter")
               #numericInput("page", "Page", 1, min = 1)
        ),
        column(12,
               tabsetPanel(
                 tabPanel('pressure',
                          DT::dataTableOutput("mytable1")),
                 tabPanel('mtcars',
                          DT::dataTableOutput("mytable2")),
                 tabPanel('iris',
                          DT::dataTableOutput("mytable3"))
               )
        )
      )
    )

【问题讨论】:

    标签: r pagination shiny dt


    【解决方案1】:

    重要的部分是使用stateSave参数,见下文:

    library(DT)
    library(shiny)
    app <- shinyApp(
      ui = fluidPage(
        tags$head(
          # hides the default search functionality
          tags$style(
            HTML(".dataTables_filter, .dataTables_info { display: none; }")
          )
        ),
        fluidRow(
          column(10, 
                 ""
          ), 
          column(2,              
                 # adding new page filter
                 uiOutput("pageFilter")
          ),
          column(12,
                 tabsetPanel(id = "tab",
                    tabPanel('pressure',
                      dataTableOutput('table1')
                    ),
                    tabPanel('mtcars',
                      dataTableOutput('table2')
                    )
                 )
          )
        )
      ),
      server = function(input, output) {
    
        global <- reactiveValues()
    
        observe({
          global$val <- input$table1_state$start / input$table1_state$length + 1
         })
    
        observe({
          global$val <- input$table2_state$start / input$table2_state$length + 1
        })
    
        output$pageFilter <- renderUI({
          numericInput("page", "Page", global$val, min = 1)
        })
    
        output$table1 <- DT::renderDataTable({
          iris
        }, options = list(pageLength = 5, stateSave = TRUE))
    
        output$table2 = DT::renderDataTable({
          mtcars
        }, options = list(pageLength = 5, stateSave = TRUE))
    
        # using new page filter
        observeEvent({input$page; input$tab}, {
          dataTableProxy("table1") %>% selectPage(global$val)
          dataTableProxy("table2") %>% selectPage(global$val)
        })
    
      }
    )
    
    runApp(app, launch.browser =  TRUE)
    

    【讨论】:

      猜你喜欢
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-31
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      • 1970-01-01
      相关资源
      最近更新 更多