2017-09-25 7 views
1

J'utilise actuellement un datatable dans un document pour créer un flexdashboard. J'ai une colonne numérique avec NA dedans. Lorsque je clique pour trier la colonne dans l'ordre décroissant, elle place la plus grande valeur en premier et les valeurs NA/null en dernier. Lorsque je trier par ordre croissant, les valeurs NA/NULL sont placées en premier, puis les valeurs numériques. Existe-t-il un moyen de trier la valeur nulle en dernier lors du tri dans l'ordre croissant? Il semble que DataTables pourrait avoir un plugin pour ce problème, mais je vois qu'il est not supported par la version R DataTables. Je cherche à pouvoir trier les colonnes numériques de la même manière que RStudio avec une table quand vous l'affichez.Trier les valeurs nulles en dernier avec DataTables dans R

Voici un exemple reproductible de la fonctionnalité Je cherche:

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) 

Quand je trier l'ordre colonne Numeric.null ascendante la table devrait ressembler à ceci:

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

qui Cela fait. Quand je sorte Numeric.null colonne descendant pour la table devrait ressembler à ceci:

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

Répondre

0

L'astuce consiste à fournir une fonction de tri à l'aide rappel l'argument. La fonction js de l'exemple ne fonctionne pas pour moi (je suppose que l'argument value devrait être fourni - il a besoin d'un peu de travail), mais voici un exemple avec ma propre fonction de tri.

Il est important de noter que le type de colonne de tri doit être changé en caractère juste avant d'appeler la fonction datatable. Gardez à l'esprit que si l'argument rownames DT est réglé sur FALSE colonnes ont des numéros 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)