2017-09-25 35 views
1

flexdashboardを作成するには、文書で現在datatableを使用しています。私はそれにNAの数値列を持っています。列を降順で並べ替えるためにクリックすると、最も大きい値が最初に置かれ、NA/NULL値が最後になります。私が昇順で並べ替えると、最初にNA/Null値とその後の数値が入れられます。昇順でソートするときに最後にnull値をソートする方法はありますか? DataTablesのように、この問題でpluginがあるかもしれませんが、R DataTablesのバージョンではnot supportedです。 RStudioがテーブルを表示するのと同じ方法で数値カラムをソートできるようになっています。私は、テーブルには次のようになります昇順Numeric.null列をソートする場合最後のヌル値をR内のDataTablesでソート

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) 

:ここ

は私が探しています機能の再現性の一例である

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 

答えて

0

はトリックがコールバック引数を使用してソート機能を提供することです。この例の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) 
を持っていることを心に留めておきます
関連する問題