Как показать значения в скрытых столбцах для 'datatable' (R) в правильном формате? - PullRequest
2 голосов
/ 06 марта 2020

В R имеется расширение для datatables, которое называется "Отзывчивый". Добавляет кнопку «зеленый плюс» в левой части ряда. Нажав на нее, мы можем получить вид с «скрытыми» столбцами.

Вот пример. «Видимый» столбец «mpg_percents_visible» имеет правильный формат (3%), когда «скрытый» столбец «mpg_percents_hidden» имеет неправильное форматирование в расширенном представлении (0.0326644890340644).

library(DT)

# 1. Data set
df_mtcars <- mtcars %>% 
  mutate(
    mpg_percents_visible = mpg / sum(mpg),
    mpg_percents_hidden = mpg / sum(mpg)) %>% 
  select(mpg_percents_visible, everything())

# 2. Datatable
datatable(df_mtcars, extensions = c('Responsive')) %>% 
  formatPercentage(c('mpg_percents_visible', 'mpg_percents_hidden'))

Как отобразить скрытый столбец «mpg_percents_hidden» в правильный формат (3%)?

Спасибо!

1 Ответ

1 голос
/ 06 марта 2020

Функция formatPercentage перезаписывает данные ячеек с помощью опции rowCallback Datatables, и это не влияет на скрытые столбцы. Нужно внести изменения в функцию render опции columnDefs (поэтому вы должны записать форматирование в JavaScript).

library(dplyr)
library(DT)

df_mtcars <- mtcars %>% 
  mutate(
    mpg_percents_visible = mpg / sum(mpg),
    mpg_percents_hidden = mpg / sum(mpg)) %>% 
  select(mpg_percents_visible, everything())

render <- c(
  'function(data, type, row, meta){',
  '  if(type === "display"){',
  '    return (100*parseFloat(data)).toFixed(0) + "%";',
  '  }else{',
  '    return data;',
  '  }',
  '}'
)

datatable(
  df_mtcars, 
  extensions = c('Buttons', 'Responsive'), 
  options = list(
    responsive = TRUE,
    columnDefs = list(
      list(targets = 13, render = JS(render))
    )
  )) %>% 
  formatPercentage('mpg_percents_visible')

enter image description here

Я узнал, что здесь . Обратите внимание, что:

Единственный потенциальный улов с этим будет, если что-то изменится - columns.render вызывается только один раз, а затем кэшируется, тогда как этот расчет в rowCallback вызывается при каждом отрисовке. Если данные имеют статус c, то то, что я предложил, будет в порядке.

...