Learning DT包

Usage

DT包主要用到的函数是datatable(),其参数如下:

datatable(data, options = list(), class = "display", callback = JS("return table;"), 
rownames, colnames, container, caption = NULL, filter = c("none", "bottom", 
    "top"), escape = TRUE, style = "default", width = NULL, height = NULL, 
elementId = NULL, fillContainer = getOption("DT.fillContainer", NULL), autoHideNavigation = getOption("DT.autoHideNavigation", 
    NULL), selection = c("multiple", "single", "none"), extensions = list(), 
plugins = NULL)

下面主要介绍下几个参数的用法

Arguments

  1. class:默认是display,其他用法可以看https://datatables.net/manual/styling/classes,其实个人觉得差别不大

  2. rownames:TRUE or FALSE判断是否需要rownames,colnames类似;还可以自定义rowname,包括对已有的名字进行替换,colnames也类似,如替换第2列和第4列的列名:

    datatable(head(iris), colnames = c('Another Better Name' = 2, 'Yet Another Name' = 4))
    
  3. container:这是一个比较有用的参数,可以提供不同的table container来装table cells;首先你需要自己设定一个table,然后将设定好的table作为container的参数,这里需要点CSS的基础知识,如

    # a custom table container
    sketch = htmltools::withTags(table(
        class = 'display',
        thead(
            tr(
                th(rowspan = 2, 'Species'),
                th(colspan = 2, 'Sepal'),
                th(colspan = 2, 'Petal')
            ),
            tr(
                lapply(rep(c('Length', 'Width'), 2), th)
            )
        )
    ))
    print(sketch)
    
    datatable(iris[1:20, c(5, 1:4)], container = sketch, rownames = FALSE)
    
  4. caption:这是一个设定标题的,简单点的话就直接后面跟字符串,复杂点的话可以调用htmltools::tags$caption来设定不同的样式

  5. filter:这是一个过滤的功能,如 filter = ‘top’即可在列名下面出现一个可用于过滤的框;如果是数值型的,会有最小值到最大值的框;如果是因子型的话,会有个下拉选择框;如果是字符串型,会有个匹配过程,即只显示匹配上输入字符串的内容

  6. callback:这是一个可用于执行datatable初始化后的javascript函数,比如下面这个例子,当展现datatable内容时,javascript会执行跳入下一页的程序,所以会显示下一页的内容

    datatable(head(iris, 30), callback = JS('table.page("next").draw(false);'))
    
  7. escape:这个主要是一个逻辑值,TRUE则表示显示html代码,FALSE则不显示

options:这个是一个非常强大的功能,你可以将这些options写在list中用于定制自己想要的datatable,如:

  1. 比如你想设定某一列的表格的宽度,你需要先打开autoWidth = TRUE,然后通过columnDefs参数来设定,如将第1列和第3列的宽度设置为200,内容居中

    columnDefs = list(list(className = 'dt-center', width = '200px', target = c(1,3))
    
  2. pageLength:字面上就能理解,指定datatable页面显示行数

  3. lengthMenu:可以搭配pageLength来使用,其是用于设定页面左上角show框中的显示页面数目的列表

  4. options还可以用于设定全局的options,如:下面的language可以用于改变页面上原本设定的名字

    options(DT.options = list(pageLength = 5, language = list(search = 'Filter:')))
    
  5. order:可用于对特定的某列进行排序,如:

    order = list(list(2, 'asc'), list(4, 'desc'))
    
  6. dom:一个很有用的参数,主要用于设定页面的一些显示的框框,比如:f表示search过滤框;t表示table;l表示控制显示的table行数;i表示table的information;p表示右下角的页码框;r表示Enable or disable the display of a ‘processing’ indicator when the table is being processed (e.g. a sort);B表示用于buttons控件

  7. initComplete:相当于callback作用,如:下面代码可以设定表头的背景颜色

    datatable(head(iris, 20), options = list(
        initComplete = JS(
        "function(settings, json) {",
        "$(this.api().table().header()).css({'background-color': '#000', 'color': '#fff'});",
        "}")
    ))
    

Helper Functions

  1. 用format*()函数来给特定的列设置特定的格式,比如美元符和百分号

    datatable(m) %>% formatCurrency(c('A', 'C')) %>% formatPercentage('D', 2)
    datatable(m) %>% formatCurrency(1:2, '\U20AC', digits = 0) %>% formatRound('E', 3)
    
  2. formatStyle:可用于对table cells设置CSS格式,例如字体颜色,背景颜色,字体等,如:

    datatable(iris, options = list(pageLength = 5)) %>%
        formatStyle('Sepal.Length',  color = 'red', backgroundColor = 'orange', fontWeight = 'bold')
    

    此外,还有styleInterval(), styleEqual(), and styleColorBar()等函数可以用于设定table cells(对特定的值以及范围内的数字进行CSS设定)

  3. tableHeader()和tableFooter()函数可用于设定页眉和页脚,当你想定义一个特定的table container

  4. saveWidget()可用于保存html的结果

DataTables Extensions

  1. 我们可以将多个extensions放置在datatable()函数内,如:

    extensions = c('AutoFill', 'ColReorder')
    

    但不是所有extensions都可以兼容的放置在一起的,具体可以查看:https://datatables.net/download/compatibility

  2. AutoFill:在你鼠标移到某个cell上时,cell的右下角会有个蓝色小方框,如:

    datatable(iris, extensions = 'AutoFill', options = list(
        autoFill = list(columns = c(1, 2, 3), focus = 'click')
    ))
    

    这里有个focus参数,默认的是鼠标放上去就会显示蓝色小方框,如果设定为click,则表示点击后才会显示

  3. Buttons:是一个非常有用的控件,可以提供保存table为CSV/XLS/PDF、复制table以及打印table的功能,注意:在使用这个前提,需要在dom参数添加B选项,如:

    datatable(
        iris, extensions = 'Buttons', options = list(
            dom = 'Bfrtip',
            buttons = c('copy', 'csv', 'excel', 'pdf', 'print')
        )
    )
    
  4. ColRecorder:主要用于拖拽行,就跟excel里面改变行位置一样的功能,如下,如果添加个realtime=FALSE,则表示拖拽的时候不显示拖拽后的结果,当鼠标停止拖拽后才显示

    # disable realtime updating
    datatable(iris2, extensions = 'ColReorder', options = list(
        colReorder = list(realtime = FALSE)
    ))
    
  5. ColVis:主要用于选择需要显示的列,其封装在Buttons里面,用法如下:

    # using I() here to make sure it is converted to an array in JavaScript
    datatable(
        iris, rownames = FALSE,
        extensions = 'Buttons', options = list(dom = 'Bfrtip', buttons = I('colvis'))
    )
    

    因为是传入单个colvis参数,所以要用I()将其转为数组,但是如果是下面的情况,就不需要了

    buttons = list(list(extend = 'colvis', columns = c(2, 3, 4)))
    
  6. FixedColumns:当列较多时,就可以用这个参数,形成类似excel表格的滚动条,scrollX=TRUE表示横向滚动条,FixedColumns=TRUE表示默认所有列都是可滚动的,如果其后面接list(leftColumns = 2, rightColumns = 1)表示左数第2列和右数第1列保持不动,其他则可滚动,如:

    # fix some left 2 columns and right 1 column
    datatable(
        m, extensions = 'FixedColumns',
        options = list(
            dom = 't',
            scrollX = TRUE,
            fixedColumns = list(leftColumns = 2, rightColumns = 1)
        )
    )
    
  7. KeyTable:这个类似于excel表格中选中某个cell时的周围的框,也可以随意上下左右移动该cell,当鼠标选中某个cell时

    datatable(iris2, extensions = 'KeyTable', options = list(keys = TRUE))
    
  8. Responsive:这个简单的说就是当你表格的显示窗口太窄时,其可以将不能显示的内容隐藏在某一位置,点击后即可查看,如下:

    datatable(iris2, extensions = 'Responsive')
    
  9. RowReorder:这个类似于ColRecorder,只是这个是对应row来操作的,但是如果你colnames参数固定为ID=1,则表示当你移动某个ROW时,其第一列ID的值是不会变的,可以看如下的代码:

    datatable(
        iris2, colnames = c(ID = 1), extensions = 'RowReorder',
        options = list(rowReorder = TRUE)
    )
    
  10. Scroller:这个类似于FixedColumns,其是在纵向有个滚动条,当行数太多不能全部显示的时候使用,对于scrollY不是逻辑值而是数值型时,其表示在滚动时显示的垂直长度,如:

    m = matrix(runif(1000 * 4), ncol = 4, dimnames = list(NULL, letters[1:4]))
    m = cbind(id = seq_len(nrow(m)), round(m, 2))
    datatable(m, extensions = 'Scroller', options = list(
        deferRender = TRUE,
        scrollY = 200,
        scroller = TRUE
    ))
    

以上均来自于https://rstudio.github.io/DT/的笔记,属于DT包的基础部分,详细的options参数可以查https://datatables.net/reference/option/,DT包跟shiny结合使用是一个非常棒的选择。