【问题标题】:Shiny DT: How to type page number manually?Shiny DT:如何手动输入页码?
【发布时间】:2019-06-28 12:31:42
【问题描述】:

我有一张 100 多页的长桌。我需要添加一些功能,以便用户可以键入页数,例如 50,然后轻松转到此页面。当需要打开位于间隔中间的某个页面时,很长的表格会出现此问题。在这种情况下,用户必须多次单击“上一个”或“下一个”按钮。

在下面的示例中,我无法一键打开第 8 页。

if (interactive()) {
  library(shiny)
  library(DT)
  shinyApp(
    ui = fluidPage(fluidRow(column(12, DTOutput('tbl')))),
    server = function(input, output) {
      output$tbl = renderDT(
        iris, options = list(lengthChange = FALSE)
      )
    }
  )
}

【问题讨论】:

    标签: r shiny pagination dt


    【解决方案1】:
    library(shiny)
    library(DT)
    
    shinyApp(
      ui = fluidPage(
        fluidRow(
          div(style = "display:inline-block;", 
              numericInput("page", "Go to page:", value = 1, min = 1)),
          div(style = "display:inline-block;", 
              actionButton("gotopage", "Go"))
        ),
        fluidRow(
          column(12, DTOutput('tbl'))
        )
      ),
      server = function(input, output) {
        output$tbl = renderDT({
          datatable(
            iris, 
            callback = JS(c(
              "$('#gotopage').on('click', function(){",
              "  var page = parseInt($('#page').val())-1;",
              "  table.page(page).draw('page');",
              "});"
            ))
          )
        })
      }
    )
    


    另一种选择:

    library(shiny)
    library(DT)
    
    shinyApp(
      ui = fluidPage(
        tags$head(tags$style(".pagination {float: right;}")),
        fluidRow(
          div(id="pagination", 
              div(style = "display:inline-block;", 
                  tags$a(id = "first", style = "cursor: pointer;", "First")),
              div(style = "display:inline-block;", 
                  tags$a(id = "previous", style = "cursor: pointer;", " Previous")),
              div(style = "display:inline-block;", 
                  tags$input(id="page", type="number", class="input-sm", value="1", min="1")
              ),
              div(style = "display:inline-block;", 
                  tags$span(id = "of")),
              div(style = "display:inline-block;", 
                  tags$a(id = "next", style = "cursor: pointer;", "Next ")),
              div(style = "display:inline-block;", 
                  tags$a(id = "last", style = "cursor: pointer;", "Last"))
          )
        ),
        fluidRow(
          column(12, DTOutput('tbl'))
        )
      ),
      server = function(input, output) {
        output$tbl = renderDT({
          datatable(
            iris, options = list(
              dom = "lfrti<'pagination'>", 
              initComplete = JS(c(
                "function(settings, json){",
                "  var table = settings.oInstance.api();",
                "  var pageinfo = table.page.info();",
                "  $('#of').text('of ' + pageinfo.pages);",
                "}"
              ))
            ),
            callback = JS(c(
              "$('div.pagination').append($('#pagination'));",
              "$('#first').on('click', function(){", 
              "  table.page('first').draw('page');",
              "  $('#page').val(1);",
              "});",
              "$('#previous').on('click', function(){", 
              "  table.page('previous').draw('page');",
              "  $('#page').val(table.page.info().page + 1);",
              "});",
              "$('#next').on('click', function(){", 
              "  table.page('next').draw('page');",
              "  $('#page').val(table.page.info().page + 1);",
              "});",
              "$('#last').on('click', function(){", 
              "  table.page('last').draw('page');",
              "  $('#page').val(table.page.info().pages);",
              "});",
              "$('#page').on('change', function(){",
              "  var page = parseInt($('#page').val());",
              "  if(!isNaN(page)){ table.page(page-1).draw('page'); }",
              "});"
            ))
          )
        })
      }
    )
    

    【讨论】:

    • 我喜欢你的解决方案。我希望DT 中有一些内部选项,它允许在分页控件内键入页数。我浏览了官方文档,但仍然没有找到任何东西datatables.net/examples/basic_init/alt_pagination.html
    • @iomedee 我认为有一个插件可以做到这一点(分页输入),但目前它不适用于 Datatables 1.10.x。这里演示:jsfiddle.net/qammar/ad4t12r8/2
    • @iomedee 查看我的编辑。此方法替换了分页控件。
    • 你太棒了!
    猜你喜欢
    • 2021-11-14
    • 2020-11-27
    • 2018-10-07
    • 2013-11-07
    • 2020-12-29
    • 2022-01-22
    • 2018-11-01
    • 2021-04-17
    • 1970-01-01
    相关资源
    最近更新 更多