7  交互表格

表格常用来汇总展示数据,交互表格附带更多的功能,可以按列分组、排序、搜索,也可以按行分组、折叠,还可以上下滚动、左右滚动、前后翻页、页面挑转、导出数据等。交互表格是需要放在网页中的,制作这样的表格需要谢益辉开发的 DT 包,它的覆盖测试达到 31%, 它基于 jQuery 框架的衍生品 DataTables 库,提供了一个 R 的封装,封装工具和许多其他基于 JS 库的 R 包一样,都依赖于 htmlwidgets

7.1 基础功能

7.1.1 创建表格

7.1.2 添加标题

7.1.3 添加注释

7.1.4 水平滚动

7.1.5 垂直滚动

7.1.6 数据分页

7.1.7 适应宽度

7.1.8 行列分组

7.1.9 列格式化

7.1.10 数据配色

library(tibble)

dat <- tribble(
  ~name1, ~name2,
  as.character(htmltools::tags$b("加粗")), as.character(htmltools::a(href = "https://rstudio.com", "超链")), # 支持超链接
  as.character(htmltools::em("强调")), '<a href="#" onclick="alert(\'Hello World\');">Hello</a>',
  as.character(htmltools::span(style = "color:red", "正常")), "正常"
)

根据数据的大小配上颜色

colorize_num <- function(x) {
  ifelse(x > 0,
    sprintf("<span style='color:%s'>%s</span>", "green", x),
    sprintf("<span style='color:%s'>%s</span>", "red", x)
  )
}
colorize_pct <- function(x) {
  ifelse(x > 0,
    sprintf("<span style='color:%s'>%s</span>", "green", scales::percent(x, accuracy = 0.01)),
    sprintf("<span style='color:%s'>%s</span>", "red", scales::percent(x, accuracy = 0.01))
  )
}

colorize_pp <- function(x) {
  ifelse(x > 0,
    sprintf("<span style='color:%s'>%s</span>", "green", paste0(round(100*x, digits = 2), "PP")),
    sprintf("<span style='color:%s'>%s</span>", "red", paste0(round(100*x, digits = 2), "PP"))
  )
}

colorize_text <- function(x, color = "red") {
    sprintf("<span style='color:%s'>%s</span>", color, x )
}
library(DT)
datatable(
  data = dat, escape = FALSE, 
  colnames = c(colorize_text("第1列", "red"), 
               as.character(htmltools::em("第2列"))),
  options = list(
    pageLength = 5, # 每页显示5行
    dom = "t"
  )
)
表格 7.1: 数据配色

Base R 内置的 R 包含有丰富的数据集,非常适合演示图形和阐述统计理论,后面技术和理论部分的介绍大多围绕内置的数据集展开,数据集及其描述如下表所示:

# 抽取 R 包信息
Pkgs <- sapply(list.files(R.home("library")), function(x) {
  packageDescription(pkg = x, fields = "Priority")
})
# 抽取内置 R 包列表
CorePkgs <- names(Pkgs[Pkgs %in% c("base", "recommended") & !is.na(Pkgs)])
# 抽取 R 包的数据集
BaseDataSets <- data(package = CorePkgs)$results[, c("Package", "Item", "Title")]

library(DT)
datatable(BaseDataSets,
  rownames = FALSE, # 不显示行名
  extensions = c("Buttons", "RowGroup"),
  options = list(
    pageLength = 10, # 每页显示的行数
    language = list(url = "//cdn.datatables.net/plug-ins/1.10.11/i18n/Chinese.json"), # 汉化
    dom = "Bfrtp", # 去掉显示行数 i、过滤 f 的能力,翻页用 p 表示
    ordering = F, # 去掉列排序
    buttons = c("copy", "csv", "excel", "print"), # 提供打印按钮
    rowGroup = list(dataSrc = 0), # 按 Package 列分组
    columnDefs = list(
      list(className = "dt-center", targets = 0), # 不显示行名,则 targets 从 0 开始,否则从 1 开始
      list(visible = FALSE, targets = 0) # 不显示 Package 列
    )
  )
)
表格 7.2: Base R 包内置的数据集

7.2 扩展功能

7.2.1 汉化表格

7.2.2 下载数据

7.3 其它工具