14.2.3 使用shinydashboard构建数据看板
shinydashboard和shiny的作用类似,但是shinydashboard的使用更为简单。shinydashboard和shiny的代码结构相似,具体如下:
下面详细介绍shinydashboard中主要函数的功能与使用技巧。
1.数据看板标题栏的设置
在shinydashboard中,dashboard Header()函数控制标题栏,标题栏包括页面标题和下拉菜单,它们分别通过title()和dropdown Menus()两个函数来控制。title()函数可以设置web页面的名称,示例代码如下:
dropdown Menus()函数控制下拉菜单。下拉菜单有3种类型:消息菜单(Message Menu)、通知菜单(Notification Menu)和任务菜单(Task Menu),可以通过type参数对其进行控制。3种类型的下拉菜单均内置了X-Item()函数,它可控制下拉菜单的内容,同时添加多个菜单。以messageItem()函数为例,在用户界面端代码文件ui.R中进行如下修改,运行文件的输出结果如图14-6所示。
图14-6 数据看板页面信息代码运行结果示例
图14-6中的icon图标是使用icon函数加入的。shiny支持2个常用的图标库,分别是Font Awesome和Glyphicons。默认情况下使用的图标库是Font Awesome,可以通过lib参数对其进行控制。
当前修改都局限在用户界面端代码文件ui.R中,但是用户界面通常用于页面风格的调整,而界面呈现的内容来源于服务器端代码文件server.R。因此,需要在用户界面端使用dropdown MenuOutput()函数,同时在服务器端使用render Menu()函数完成提交,进而由服务器端代码文件定义用户界面的菜单内容,代码示例如下:
上述代码首先在服务器端定义了message Menu,即将内容输入数据框;其次,对output对象增加变量messageMenu,实现对输出内容的调用;最后,在用户界面端代码文件ui.R中使用dropdown Menu Output()函数调用服务器端文件server.R中定义的message Menu。上述步骤看似比较复杂,但可将页面内容和页面格式分离,如果用户想调整页面格式,只需修改用户界面端代码文件ui.R;如果用户想调整页面内容,也只需修改服务器端代码文件server.R。这样做的优点在于,当web界面输出数据量大时,上述步骤不仅可以减少代码修改量,还便于输出美观、可控的页面。
通知菜单和任务菜单的使用方式和消息菜单基本相同,但参数设置上略有差别,这里不再介绍,感兴趣的读者可以查看参考文档。
2.数据看板输入与输出信息的设置
通过在数据看板的侧边栏添加输入与输出信息,用户可以调整部分参数或者上传数据获取需要的信息。shinydashboard()函数支持shiny自带的所有Input对象。输出则需要一对组合函数,其中,Output()函数用于用户界面(UI)端,render()函数用于服务器(server)端,二者通过变量名进行匹配。shinydashboard同样支持shiny自带的所有输出组合。
用户创建的web侧边栏由dashboardSidebar()函数控制。下面以滑动条为例讲解信息输入的方法。
假设在用户界面(UI)端设置了传入整数,设定最小值为0,最大值为1 000,默认值为500。通过dashboardBody()函数输出一个表格,以展示数据的变化结果。在服务器(server)端,需要使用reactive()函数计算反应表达式,生成output对象需要的变量,之后使用render Table({slider Values()})调用反应表达式,示例代码如下:
上述代码对应的输出结果如图14-7所示。
图14-7 数据看板输出信息示例
注意,选择框、勾选框等控件的使用方式和滑动条的基本相似。接下来介绍如何在侧边栏添加文件的上传和下载功能。
首先,修改用户界面(UI)端代码文件ui.R,一般而言,shiny上传的每个文件默认最大不超过5 Mb,可以通过shiny.max RequestSize函数选项来修改这个限制。例如,在服务器端代码文件server.R的最前面加上“options(shiny.max RequestSize=30*1024^2)”,就可以将上传文件的限制提高到30 Mb。以读取csv文件为例,我们可以将DT包作为HTML控件输出。DT包自带render DT()和DTOutput()函数,它们可以分别用于用户界面(UI)端和服务器(server)端。
其次,使用fileInput()函数设定上传的文件类型。checkboxInput()函数可以设置勾选框,也可以选择文件是否有变量名。radioButtons()函数用于设置单选按钮,可以设定常用的几种分隔符。
最后,修改服务器(server)端代码文件server.R,通过设置DT包中的参数对上传的文件进行格式输出。用户界面(UI)端和服务器(server)端代码文件示例如下:
数据看板侧边栏添加文件上传功能的示例如图14-8所示。
图14-8 数据看板侧边栏添加文件上传功能的示例
在数据看板侧边栏添加下载文件功能的方式与添加上传文件功能的方式类似,读者可以自行探索。
shiny提供了15种不同的侧边栏输入方式,以及7种不同的输出组合,受篇幅所限,本书不再一一介绍,感兴趣的读者可以查看shiny官网(https://shiny.rstudio.com/)进行学习。
3.数据看板的主体搭建
使用shiny搭建的数据看板主体代表呈现的核心内容。数据看板主体可以包含任何内容,如图片、文本、表格、leaflet控件甚至输入对象,其中最常见的主体是对象框(Boxes),它同样可以包含任何内容,下面进行详细展开。
对象框(Boxes):通常将box置于fluid Row()函数内。box对象有box、tabBox、infoBox和valueBox四种类型,它们各自适用于不同的使用场景。
box()函数中有几种常用的基础参数,说明如下:
将box置于fluid Row()函数内,需要首先调用服务器(server)端代码绘制gplot_1对象,然后设置box参数,代码示例如下:
在服务器(server)端,我们使用ggplot2绘制图表,数据来源于showtext包,同时我们还可以调用RColor Brewer包调整box的颜色,示例代码如下:
上述代码对应的输出结果如图14-9所示。
图14-9 shiny搭建的数据看板主体输出结果
插入侧边栏或者box的流程如下。
·在服务器(server)端定义反应表达式,然后生成要输出的对象,调用反应表达式。
·在用户界面(UI)端调用在服务器(server)端生成的对象,并设置生成对象的格式。
上述流程比较简单,从定义反应表达式到设置格式,shiny提供了多种多样的内置函数,用户可以通过设置这些函数的参数,完成web页面定制。
4.数据看板的页面布局
一般而言,使用shiny搭建的数据看板页面布局主要有多行布局和多列布局两种,下面分别进行说明。
(1)多行布局
鉴于网页的高度是可变的,数据看板的多行布局只需依次添加多个fluid Row()对象,此外,在同一行可以设置多个box。通常情况下,fluid Row()对象内的box()函数不添加height参数,如果添加height参数,那么同一行的height参数必须相同,即同一个fluid Row()对象内的height参数必须相同,需要说明的是,height参数的单位是像素。
用户可以依次定义多个fluid Row()对象,并在每个函数中添加box,从而通过改变status参数来改变box的状态,相关示例代码如下:
上述代码对应的输出结果如图14-10所示。
图14-10 数据看板多行布局输出页面示例
(2)多列布局
数据看板多列布局的方法为:先在fluid Row()对象内添加多个column()对象,然后在column()对象中添加box()对象。在每个column()对象中,用户可以添加多个box,也可以设置每个box的格式。column()对象内的box()函数通常设置width=NULL,默认为6。column()对象内设定的offset偏移参数表示当前列与前1列之间的间隙,单位与width相同。定义body对象的代码如下:
上述代码对应的输出结果如图14-11所示。
图14-11 数据看板多列布局输出页面示例