如何为 JavaScript 库创建 htmlwidgets 组件?

更新时间

为 JavaScript 库创建 htmlwidgets 组件,本质是写一个 R 绑定(binding),把 R 对象和 JavaScript 可视化库桥接起来。htmlwidgets.org 的 Develop / Creating a widget 页面给出的路径是:为某个 JavaScript 库实现 R 绑定后,这个组件就能在 R 控制台、R Markdown 文档和 Shiny 应用中使用。适用条件是:你已经选定了一个 JavaScript 可视化库,并希望它在 R 里像 plot 一样被调用。

一个 htmlwidgets 组件由什么构成

htmlwidgets 的定位是“把最好的 JavaScript 数据可视化带到 R”。它让 HTML widgets 用起来和 R 的 plot 类似,区别是产出交互式网页可视化——一两行 R 代码就能生成 D3 图形或 Leaflet 地图。

要让它同时能在控制台、R Markdown 和 Shiny 中工作,组件需要处理三件事:

  • R 侧:接收 R 数据与参数,序列化为 JavaScript 可读的形式。
  • JavaScript 侧:接收数据,调用目标库完成渲染。
  • 桥接层:由 htmlwidgets 框架负责 R 与 JavaScript 之间的无缝衔接。

开发步骤

1. 选定目标 JavaScript 库

先确定要绑定的库。网站展示的组件覆盖了多种类型,可作为选型参考:

组件 用途
Leaflet 地理空间映射
dygraphs 时间序列图表
Plotly 基于 D3 的交互式图形
rbokeh Bokeh 的 R 接口
Highcharter Highcharts 的 R 接口
visNetwork 基于 vis.js 的网络图可视化
networkD3 基于 D3 的图数据可视化
DataTables 表格数据展示
threejs 3D 散点图与地球仪
rglwidget 渲染 rgl 创建的场景
DiagrammeR 图表与流程图
MetricsGraphics 基于 D3 的散点图与折线图

2. 编写 R 绑定

按照 Develop / Creating a widget 的指引,为你的 JavaScript 库编写 R 绑定。绑定完成后,组件即可在 R 控制台、R Markdown 文档和 Shiny 应用三处使用。

3. 处理组件尺寸

网站把 Widget sizing 单列为开发主题,说明尺寸设置是组件开发中需要专门处理的一环,而不是可忽略的细节。

4. 按需深入进阶主题

Advanced topics 面向更复杂的开发需求。如果组件需要与其他组件联动,可以了解 crosstalk:它支持组件之间的联动刷选(linked brushing)和客户端过滤;更复杂的交互则用 Shiny 实现。

开发完成后能做什么

  • 在 R 控制台使用:像调用 plot 一样调用组件。
  • 嵌入 R Markdown 文档:在报告中直接输出交互式可视化。
  • 嵌入 Shiny 应用:作为交互式 Web 应用的一部分。
  • 组合成仪表盘:用 flexdashboard 把多个 htmlwidgets 组合进仪表盘,它提供基于行和列的灵活布局。
  • 组件间联动:用 crosstalk 把组件连接起来。

从哪里开始

网站提供 Showcase 展示精选组件,Gallery 可浏览 50 多个可用组件。开发新组件时,先看 Showcase 里同类组件的实现方式,再进入 Develop / Creating a widget 按步骤操作。如果目标只是使用现成组件而非开发新组件,直接查 Gallery 即可。