我最喜欢的R组件之一,彻底地改变了R语言的可视化格局。Shiny是RStudio公司开发的新包,有了它,可以用R语言轻松开发交互式web应用。
本篇所有案例出自Shiny官网。
特性有以下几点
- 只用几行代码就可以构建有用的web应用程序—不需要用JavaScript。
- Shiny应用程序会自动刷新计算结果,这与电子表格实时计算的效果类似。 当用户修改输入时,输出值自动更新,而不需要在浏览器中手动刷新。
- Shiny用户界面可以用纯R语言构建,如果想更灵活,可以直接用HTML、CSS和JavaScript来写。
- 可以在任何R环境中运行(R命令行、Windows或Mac中的Rgui、ESS、StatET、RStudio等)
- 基于Twitter Bootstrap的默认UI主题很吸引人。
- 高度定制化的滑动条小工具(slider widget),内置了对动画的支持。
- 预先构建有输出小工具,用来展示图形、表格以及打印输出R对象。
- 采用websockets包,做到浏览器和R之间快速双向通信。
- 采用反应式(reactive)编程模型,摒弃了繁杂的 事件处理代码,这样你可以集中精力于真正关心的代码上。
- 开发和发布你自己的Shiny小工具,其他开发者也可以非常容易地将它加到自己的应用中(即将面市!)
安装
Shiny可以从CRAN获取, 所以你可以用通常的方式来安装,在R的命令行里输入:
install.packages("shiny")
一个超级简单的页面
我们再目录下建一个文件夹叫做Shiny_1,在其中写入两个文件,server.R和ui.R,然后往其中添加一些代码,很少的一些代码:
# Rely on the 'WorldPhones' dataset in the datasets
# package (which generally comes preloaded).
library(datasets)
# Use a fluid Bootstrap layout
fluidPage(
# Give the page a title
titlePanel("Telephones by region"),
# Generate a row with a sidebar
sidebarLayout(
# Define the sidebar with one input
sidebarPanel(
selectInput("region", "Region:",
choices=colnames(WorldPhones)),
hr(),
helpText("Data from AT&T (1961) The World's Telephones.")
),
# Create a spot for the barplot
mainPanel(
plotOutput("phonePlot")
)
)
)
我们来分析一下上述代码,其中只分了两个部分:mainPanel和sidebarPanel,我们用函数来表示这些工具,然后我们可以看到,再mainPanel里边,我们有一个函数叫做plotOutput()函数,这个里边只有一个字符串,叫做”phenoPlot”,这个字符串很重要很重要,因为我们的后端程序,就是通过这个小小的参数进行传递到前段的。
另外,再UI里还有一个重要的东西就是select工具,那里有一个参数叫做region,这个region是从UI传到server的参数。所以Shiny的模式基本上就是,从前段接受参数,传到到后端,后端处理完的图片,直接传递到前段。写代码的时候,要有前后端的概念。
然后我们看一下server的代码:
# Rely on the 'WorldPhones' dataset in the datasets
# package (which generally comes preloaded).
library(datasets)
# Define a server for the Shiny app
function(input, output) {
# Fill in the spot we created for a plot
output$phonePlot <- renderPlot({
# Render a barplot
barplot(WorldPhones[,input$region]*1000,
main=input$region,
ylab="Number of Telephones",
xlab="Year")
})
}
我们可以看到,有一行代码写的是:output$phenoPlot,这个很重要,因为phenoPlot就是之前的plot的名字。
全部写完以后,我们打开R,载入shiny包,然后输入:
runApp("./Shiny_1")
就可以看到网页:
下面我们来看一下数据的情况:
> WorldPhones
N.Amer Europe Asia S.Amer Oceania Africa Mid.Amer
1951 45939 21574 2876 1815 1646 89 555
1956 60423 29990 4708 2568 2366 1411 733
1957 64721 32510 5230 2695 2526 1546 773
1958 68484 35218