如何为 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 即可。