R DT :: datatables, форматирующие несколько столбцов одновременно - PullRequest
0 голосов
/ 09 ноября 2018

Я хочу реализовать formatCurrency() и formatPercentage() (оба из пакета DT) для нескольких столбцов одновременно в блестящей панели инструментов. Я использую блестящий материал для данного примера.

В настоящее время я делаю следующее:

# The packages to load.
required_packages <- c("shiny", "shinymaterial", "DT", "tidyverse")

# This function will load in all the packages needed.
lapply(required_packages, require, character.only = TRUE)

# A table example.
ui <- material_page(
  title = "Example table",
  tags$h1("Table example"),
  material_card(
    title = "Table",
    material_row(
      DT::dataTableOutput("data_table_example")
    ),
    depth = 1
  )
)

server <- function(input, output) {

  data_table_example_data = tibble(
    Person = paste0("Person ", c(1:100)),
    `Price $` = rnorm(100, 50000, 500),
    `Cost $` = rnorm(100, 30000, 300),
    `Probability %` = rnorm(100, 0.6, 0.1),
    `Win %` = rnorm(100, 0.5, 0.2)
    )

  # This will create an output summary table
  output$data_table_example = renderDataTable({
    result = datatable(data_table_example_data, options = list(pageLength = 100, scrollX = TRUE), 
                       class = 'cell-border stripe compact', rownames = FALSE) %>%
      formatCurrency("Price $") %>%
      formatCurrency("Cost $") %>%
      formatPercentage("Probability %", digits = 1) %>%
      formatPercentage("Win %", digits = 1)
  })
}

shinyApp(ui = ui, server = server)

Однако в функции renderDataTable() я хочу упростить функции форматирования до меньшего числа строк. Например, введите formatCurrency() в любом столбце с "$" и formatPercentage() в любом столбце с "%".

Я довольно долго искал подходящее решение, но не смог найти решение, но, полагаю, я просто упускаю довольно простое решение.

Что-то вроде:

# This will create an output summary table
  output$data_table_example = renderDataTable({
    result = datatable(data_table_example_data, options = list(pageLength = 100, scrollX = TRUE), 
                       class = 'cell-border stripe compact', rownames = FALSE) %>%
      formatCurrency(grepl("$", colnames()) %>%
      formatPercentage(grepl("%", colnames()), digits = 1)
  })

Несколько дополнительных очков:

  • Тибл на самом деле будет реактивным
  • Этот пример - очень тривиальная версия довольно сложной таблицы и набора реактивов
  • Я не хочу реализовывать форматирование в реактивной части, так как я обнаружил, что это портит функцию сортировки DT, поскольку предполагается, что столбец является символьной строкой

Любая помощь будет принята с благодарностью

1 Ответ

0 голосов
/ 09 ноября 2018

Попробуйте:

# This will create an output summary table
  output$data_table_example = renderDataTable({
    result = datatable(data_table_example_data, options = list(pageLength = 100, scrollX = TRUE), 
                       class = 'cell-border stripe compact', rownames = FALSE) %>%
      formatCurrency(grepl("$", colnames(data_table_example_data)) %>%
      formatPercentage(grepl("%", colnames(data_table_example_data)), digits = 1)
  })

Кажется, вам необходимо четко указать данные, поэтому colnames() не работает - вам нужно colnames(data_table_example_data).

Я заметил, что во время тестирования, если вы используете grepl с rownames = TRUE, имя строки становится первым именем столбца, что означает, что все форматирование завершено по одному. grep похоже, нет этой проблемы.

...