Измените pageType в DT pagination в модуле R-Shiny - PullRequest
0 голосов
/ 23 декабря 2019

В настоящее время я разрабатываю модуль R-Shiny, который создает таблицу DT, включающую подкачку страниц. По умолчанию DT тип подкачки по умолчанию - "simple_numbers". Моя цель состоит в том, чтобы изменить тип подкачки по умолчанию на "simple" (см. DataTable pagingType Documentation ).

Хотя я не нашел ничего специфического для R-Shiny, были некоторые сообщения SOчто я нашел связанным с моей задачей ( это самая полезная ), но, к сожалению, я действительно не добился прогресса.

Мои текущие попытки были:

  1. Я попытался вставить в пользовательский интерфейс:
    shiny::tags$script(
      shiny::HTML(paste0('
      $(document).ready(function() {
        $("#', ns(name), '").dataTable({
          "pagingType": "simple",
          "sPaginationType": "simple"
        });
      });')))

Но получил следующую ошибку:

jquery.min.js:2 jQuery.Deferred exception: $(...).dataTable is not a function TypeError: $(...).dataTable is not a function
Я включил это в опцию DT::datatable() object callback:
 callback = DT::JS(paste0('
        // * Examine the table 
        tableObject = table.settings()[0];
        console.log(table.settings());

        // * Pagination Type 
        tableObject.sPaginationType = "simple";

      '))

Однако, хотя в консоли инспектора нет ошибок, тип нумерации страниц не изменяется.

Итак, в этот момент я немного озадачен и задаюсь вопросом, может ли кто-нибудь помочь мне преодолеть разрыв между документацией и публикацией SO и моей текущей логикой.

Чтобы помочь ответить на этот вопрос, я создал очень простой воспроизводимый пример каждой из моих попыток ниже с предварительно загруженными данными из R.

Попытка 1:

table_ui = function(id, name = "table") {

  # * Create a namespace function using the provided id
  ns = shiny::NS(id)

  # * Build HTML shiny taglist for table view
  shiny::tagList(
    shiny::tags$script(
      shiny::HTML(paste0('
      $(document).ready(function() {
        $("#', ns(name), '").dataTable({
          "pagingType": "simple",
          "sPaginationType": "simple"
        });
      });'))),
    DT::dataTableOutput(outputId = ns(name))
  )

}

table_server = function(input, output, session, name = "table") {

  # * Extract Data ----
  data_df = shiny::reactive({ datasets::mtcars })

  # * Produce HTML Table ----
  # * NOTE: Transform "data_df()" into HTML table
  output[[name]] = DT::renderDataTable({

    # * Build HTML table 
    DT::datatable(
      data_df(), 
      rownames = FALSE, 
      options = list(
        paging = TRUE,
        pageLength = 5,
        dom = "<f<t>ip>"
      )
    )

  })

  # * Return
  return(data_df)

}

# * Create simple app

# * Define UI
ui = shiny::fluidPage(
  table_ui(id = "test", name = "report"),
)

# * Define Server
server = function(input, output, session) {

  # * Extract text input
  shiny::callModule(
    module = table_server, 
    id = "test", 
    session = session,
    name = "report")

}

# * Build App
shiny::shinyApp(ui = ui, server = server)

Попытка 2:

table_ui = function(id, name = "table") {

  # * Create a namespace function using the provided id
  ns = shiny::NS(id)

  # * Build HTML shiny taglist for table view
  shiny::tagList(
    DT::dataTableOutput(outputId = ns(name))
  )

}

table_server = function(input, output, session, name = "table") {

  # * Extract Data ----
  data_df = shiny::reactive({ datasets::mtcars })

  # * Produce HTML Table ----
  # * NOTE: Transform "data_df()" into HTML table
  output[[name]] = DT::renderDataTable({

    # * Build HTML table 
    DT::datatable(
      data_df(), 
      rownames = FALSE, 
      options = list(
        paging = TRUE,
        pageLength = 5,
        dom = "<f<t>ip>"
      ),
      # ** JS Support ----
      # * NOTE: Define JS to modify table
      callback = DT::JS(paste0('
        // * Examine the table 
        tableObject = table.settings()[0];
        console.log(table.settings());

        // * Pagination Type 
        tableObject.sPaginationType = "simple";

      '))
    )

  })

  # * Return
  return(data_df)

}

# * Create simple app

# * Define UI
ui = shiny::fluidPage(
  table_ui(id = "test", name = "report"),
)

# * Define Server
server = function(input, output, session) {

  # * Extract text input
  shiny::callModule(
    module = table_server, 
    id = "test", 
    session = session,
    name = "report")

}

# * Build App
shiny::shinyApp(ui = ui, server = server)

1 Ответ

0 голосов
/ 23 декабря 2019

Вам не нужно прибегать к JavaScript. Просто добавьте pagingType = "simple" в список опций.

...