Сортировать нулевые значения последними с DataTables в R

В настоящее время я использую datatable в документе rmarkdown для создания flexdashboard. У меня есть числовой столбец с NA в нем. Когда я нажимаю, чтобы отсортировать столбец в порядке убывания, он ставит самое большое значение первым, а значения NA/null последними. Когда я сортирую в порядке возрастания, сначала помещаются значения NA/null, а затем числовые значения. Есть ли способ отсортировать нулевое значение последним при сортировке по возрастанию? Похоже, что у DataTables может быть плагин для этой самой проблемы, но я вижу, что не поддерживается версией R DataTables. Я хочу иметь возможность сортировать числовые столбцы так же, как RStudio делает с таблицей, когда вы ее просматриваете.

Вот воспроизводимый пример функциональности, которую я ищу:

library(DT)
library(tidyverse)


Table.with.null <- tibble(Category=c("A","B","C","D"),
                          Numeric=seq(1,4),
                          Numeric.null=c(1,2,3,NA))

datatable(Table.with.null,rownames=FALSE)

Когда я сортирую столбец Numeric.null в возрастающем порядке, таблица должна выглядеть так:

Category  Numeric  Numeric.null
A         1        1
B         2        2
C         3        3
D         4        NA

Что он и делает. Когда я сортирую столбец Numeric.null в порядке убывания, таблица должна выглядеть так:

Category  Numeric  Numeric.null
C         3        3
B         2        2
A         1        1
D         4        NA

person Chitown    schedule 25.09.2017    source источник
comment
Забавная вещь, которую я заметил, заключается в том, что при рендеринге таблицы с использованием DT::renderDataTable через блестящее приложение, которое отправляет вывод в datatable, такая сортировка уже решена.   -  person Roman Luštrik    schedule 10.10.2018


Ответы (1)


Хитрость заключается в предоставлении функции сортировки с использованием аргумента обратный вызов. Функция js из примера у меня не работает (полагаю, нужно указать аргумент value — нужно немного поработать), но вот пример с моей собственной функцией сортировки.

Важное замечание: тип столбца сортировки следует изменить на символьный непосредственно перед вызовом функции datatable. Также имейте в виду, что пока аргумент rownames DT имеет значение FALSE, столбцы имеют номера 0,1,2,...

library(DT)
library(dplyr)

temp <-mtcars
temp[1, "wt"] <- NA
temp[2, "wt"] <- NA

#OUTPUT - dtdata
DT::datatable({
  temp %>% mutate(wt = as.character(wt))
},
callback = JS("
  $.fn.dataTableExt.oSort['NumericOrBlank-asc'] = function(x,y) {
    var retVal;
        if( x === '' || $.isEmptyObject(x)) x = 1000;
    if( y === '' || $.isEmptyObject(y)) y = 1000;
    x = (x = parseFloat($.trim(x).replace(/,/g,''))) ? x : 0;
    y = (y = parseFloat($.trim(y).replace(/,/g,''))) ? y : 0;
    if (x==y) retVal= 0; 
    else retVal = (x>y) ? 1 : -1; 
    return retVal;
  };
  $.fn.dataTableExt.oSort['NumericOrBlank-desc'] = function(y,x) {
  var retVal;
  x = (x = parseFloat($.trim(x).replace(/,/g,''))) ? x : 0;
  y = (y = parseFloat($.trim(y).replace(/,/g,''))) ? y : 0;
  if (x==y) retVal= 0; 
  else retVal = (x>y) ? 1 : -1; 
  return retVal;
  };
  "),
options = list(
  autoWidth = TRUE,
  aoColumnDefs = list(list(width = '100px', bSortable = TRUE, sType = 
'NumericOrBlank', targets = c(5)))
), rownames = FALSE)
person AdamB    schedule 06.12.2017