在Shiny中使用Echarts

  刚刚写好了《用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库,它们的反应机制是在浏览器前端人机之间的,二者组合在一起,为基于浏览器的网络应用提供了全面的交互能力。
  继续用上篇文章的下载流量监控例子,先上一个酷一点的流量表感性认识一下,体验地址

增加了一页“echarts4r测试,显示一个定制的流量表。”
调整流量提醒的阀值,改变流量表的颜色。

  仪表板中新增一页的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格式的参数控制,如下图所示:

上面样式仪表盘的JS源码

  参阅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参数定制,就是这么简单。
  运行结果如下图:


在R语言中通过列表去设置Echarts的json参数

  最后浏览一下Echarts包罗万有的图形组件,Echarts里有几十种图形(看左边的目录列表),每种图形又有很多种不同的样式,应有尽有:


折线图就有几十种样式

仪表盘也有十几种样式

还有各种3D图等

  现在,可以把这些漂亮的图形组件,用flexdashboard包放入R markdown仪表板中了,总有一款符合您的要求,慢慢玩转吧。

推荐阅读更多精彩内容