刚刚写好了《用R markdown生成仪表板》这篇文章,觉得flexdashboard包提供的组件还不够丰富,虽然还有不少htmlwidget可以引用,还是若有所缺。搜了一下,找到了这篇文章,介绍了一些不错的 JavaScript 框架或类库可以用来生成仪表板,Apache Echarts(中文文档,示例)我是知道的,非常有名和流行。然后找到了echarts4r这个包,为Echarts库提供了非常易用的R语言接口,最重要的是,在Shiny中它可以用统一的一个函数renderEcharts4r()把各种各样的所有的Echarts JS图都渲染输出了,然后在R语言中用管道操作符一个一个步骤的画图,像ggplot2一样简单易用,然后在Shiny服务器端与浏览器JS之间还提供了双向的数据更新通道:服务器端可以通过Shiny的反应机制获知浏览器端的操作,比如选择了图上的那些数据点,也可以通过Shiny代理函数发送数据到浏览器JS,动态更新Echarts,简直是酷毙了。
浏览echarts4r主页及文档,可视化组件应有尽有,太强大了,简直是发现了新大陆。概括的说,echarts4r在JS Echarts与R语言Shiny之间建立了简单易用的桥梁。Shiny反应式编程中的反应式交互是在浏览器与服务器前后端之间的,Echarts、plotly之类的JS库,它们的反应机制是在浏览器前端人机之间的,二者组合在一起,为基于浏览器的网络应用提供了全面的交互能力。
继续用上篇文章的下载流量监控例子,先上一个酷一点的流量表感性认识一下,体验地址。
仪表板中新增一页的R markdown代码如下:
echarts4r测试
=======================================================================
### 下载数/秒 (过去 5 分钟)
`\``{r}
# 拷贝代码时记得把上面反引号中的反斜杠去掉。
# downloadRate is a reactive expression that computes the download
# rate during this dashboard's lifetime.
startTime <- as.numeric(Sys.time())
downloadRate <- reactive({
elapsed <- as.numeric(Sys.time()) - startTime
nrow(pkgData()) / min(maxAgeSecs, elapsed)
})
# install.packages("echarts4r")
library(echarts4r)
# Emit the download rate
renderEcharts4r({
rate <- formatC(downloadRate(), digits = 1, format = "f")
color<- if (rate >= input$rateThreshold) "Orange" else "Green"
e_charts() |>
e_gauge(round(downloadRate(),1), "次/秒", min=0, max=120, animation=FALSE,
progress = list(show=TRUE, width=18), itemStyle=list(color=color))
})
`\``
参阅Apache Echarts中文文档,仪表盘示例(那里有各种各样Echarts可视化组件的示例),上述仪表盘示例样式的源码可知,Echarts JS组件样式的设置,是由json格式的参数控制,如下图所示:
参阅echarts4r开始文档的例子,可知JS json格式的参数在R语言中,名称一致,格式为list,这样,根据上面的各种Echarts的在线示例,我们就可以知道它们的各种参数,然后在Shiny的renderEcharts4r()函数内赋值,从而玩转Echarts了。
具体看看echarts4r开始文档中的例子:
# prepare data
df <- state.x77 |>
as.data.frame() |>
tibble::rownames_to_column("State")
library(echarts4r) # load echarts4r
df |>
e_charts(State) |> # initialise and set x
e_line(Population, smooth = TRUE) |> # add a line
e_area(Income, smooth = TRUE) |> # add area
# 非json格式的参数,直接按名称传递
e_x_axis(name = "States") |> # add x axis name
e_title("US States", "Population & Income") |> # Add title & subtitle
e_theme("infographic") |> # theme
e_legend(right = 0) |> # move legend to the bottom
e_tooltip(
# Echarts中json格式的参数,在R语言中用列表来表示。
axisPointer = list(
type = "cross"
)
)
先准备一个用于作图的data frame,通过管道操作符“|>”传给echarts4r的作图函数,通过管道逐步传给下一步的作图函数,像ggplot2一样每一步设定图形的一项要素,通过list传入json参数定制,就是这么简单。
运行结果如下图:
最后浏览一下Echarts包罗万有的图形组件,Echarts里有几十种图形(看左边的目录列表),每种图形又有很多种不同的样式,应有尽有:
现在,可以把这些漂亮的图形组件,用flexdashboard包放入R markdown仪表板中了,总有一款符合您的要求,慢慢玩转吧。