前面17节链接,点击下方有色字体即可:
入门教材、day1、day2、day3、day4、day5、day6、day7、day8、day9、day10、day11、day12、day13、day14、day15、day16、day17
在shiny包的帮助下,数据分析之后的图像变为可交互的“网页”,就像目前常见的动态网页。换句话说,使用shiny包能让你的数据分析结果“表达能力”更强。shiny包的功能复杂而强大,一篇推文显然不可能将所有功能解释清楚,所以这次教程通过几个小例子给大家展示shiny包的优点和基本用法,方便大家进一步学习探索。
例1
第一个小例子首先让大家体验一下shiny包的功能,是关于数据集iris的k-means聚类结果展示。
大家需要拿到后台代码才能在本地运行本例,没有安装shiny包的同学需要先安装并载入shiny包
代码文件保存在文件夹kmeans下的app.R中,在R中运行(*此时R中的路径应在app.R的上一级,即和文件夹kmeans位于同一级目录下):
runApp("kmeans")
结果图1所示。
图1,iris聚类结果示例。
大家可以尝试在左边调整X variable和Y variable、cluster count,观察右边图片的变化。在之前的R代码中,要展示不同对变量为坐标轴时样本的聚类情况,我们需要绘制多幅图片,而在这个例子中,只需要调整参数就可以灵活展示了。
上例,大家也可以通过函数runExample()来观察shiny包中内置的范例。如:
> runExample(“01_hello”)
shiny包中内置了11个示例,大家可以通过后台代码一一查看。
例2
了解了上面这些例子之后,观察示例中的代码不难发现,一个shiny app中一定包含了R脚本app.R,这个脚本位于文件夹下(如kmeans),运行这个shiny app只需要运行函数runApp()即可。脚本app.R则由三个部分组成:user interface object、server function和函数shinyApp()。如图2所示。
图2,脚本app.R结构。
顾名思义,上图中ui(user interface)部分定义了shiny app的“外形”,server function则控制了后台的数据交换等。(脚本app.R也可以拆分成ui和server function两个脚本,但是最新版本的shiny包不推荐这种拆分得写法。)后台代码中的app1对内置例子01_hello进行了几处细节的修改,如图3:
图3,01_hello的修改版本。
大家不妨观察一下ui和代码,有助于理解代码的含义。(上图可以通过运行得到)
> runApp(“app1”, display.mode = “showcase”)
先从ui部分开始,shiny app中一般用函数fluidPage()生成页面,页面中的元素都包含在函数fluidPage()中。函数titlePanel()和函数sidebarLayout()则是函数fluidPage()中最常用的元素,分别控制了标题和内容,函数sidebarLayout()中一般包含了控制侧边栏的函数sidebarPanel()(函数sidebarLayout()的参数position可以调整侧边栏的位置(如position=“right”时,侧边栏会出现在页面的右边))和控制主要内容的函数mainPanel(),侧边栏一般都是用于图形中的参数调整或输入。
**上面的这些函数都是最简单基本的页面设置方法,shin包还有其它类似函数,这里就留给大家自己去研究了**
在shiny app的页面设置过程中充分借鉴了HTML语言,例子app2中尽可能多的展示了这一特性,如图4所示:
图4,shiny app的ui对HTML语言的借鉴。
这个例子中涉及了字体设置,插入图片,插入链接等,和HTML语言完全类似,大家可以自行阅读app2文件夹中的app.R代码。
例3
在前两个例子中,我们可以通过改变侧边栏中的一些设置来改变图形,那这些control widgets是怎么设置的呢?我们通过app3给大家展示了常用的control widgets的设置形式。如图5,总的来说和在页面中添加文字,图片等方法类似,区别在于,每个control widgets的前两个参数都是:widget指向的变量名和widget的标签(label)。前者用于后台传递数据,后者显示在页面上(向用户解释这个control widget的用法)。
图5,control widgets的设置。
Control widgets将参数传递到后台,那这些参数导致的图形变化怎么返回在shiny app的ui上呢?要实现这一点,需要在ui和server function两部分都添加相应的函数。图6和图7分别展示了在ui和server function中常用的函数和它们对应的显示结果。
图6,在ui端添加R object的函数列表。
图7,server function中相对应的生成R obiect的常用函数。
例4
这里app4是一个不错的例子,它将两个control widgets的参数用文本的形式返回在ui上。大家可以通过运行app4和调整control widgets来观察这一过程。
了解了参数在ui和server function两端的传递过程之后,我们就可以按照R语言一般的原理将数据和参数传递给绘图函数,然后将图形显示在ui上了。这里例子census_app和stock展示这一过程(你需要在本地准备了相应的R包,如census_app中要求map包等)。如图8和图9。
图8,例子census_app
图9,例子stock。
细心的同学可能会发现,两个例子中的server function结构不太一样,这是因为函数renderPlot()中的代码在每次用户改变输入参数时都会运行一次,而函数reactive()则只有在被检查的参数改变时才运行,避免了不必要的计算(例子stock中的数据需要联网下载,如果每次都重新下载,会使代码运行缓慢)。
到这里,大家已经可以编写自己的shiny app了。那如果你想把你的shiny app分享或者展示给其它人,最简单的方式就将整个文件夹(包括数据、附加代码等)分享;当然你也可以选择上传至Github,这样你让对方在本地运行:
> runGitHub( "", "")
即可;最后你还可以采用网页式方法。这也是shiny包可视化相比于一般R包的一项优势。
shiny包借鉴了很多编写网页的思想和方法,从而实现了网页应用和R语言的“双剑合璧”,同时它也能和Markdown包、CSS、JavaScript等方法联合使用,是一种非常优秀的数据可视化方法,希望能成为大家日后数据可视化的新工具。