数据科学38 |数据产品开发-shiny包part1
1.概述
数据产品开发主要讲述了构建数据分析常见的工具以及改进数据分析过程,以便制定数据驱动的决策或支持其他数据产品的其他基础结构。主要包括以下:
・使用R Markdown包,可以以非常舒适和熟悉的方式从R中的单个文件创建网站,PDF,演示文稿,甚至是电子书。
・使用Shiny包可以在R中创建交互式Web应用程序。
・使用Plotly和Leaflet可以创建在线共享的精美交互地图,使用GoogleViz软件包可以执行类似的操作,创建地图以及交互式图形和表格。
・使用swirl和swirlify设计R中的课程,方便共享知识。
2. Shiny包
Shiny包是R中的Web开发框架。
Shiny包可以在后台使用R实际编写用户界面,允许在后台调用R来调用算法或模型。用R创建简单强大的数据产品的时间大大减少。
准备工作:
了解一些HTML、CSS和JavaScript的知识对使用Shiny包非常有用。
HTML提供网页结构和分区以及标记说明 CSS提供样式 JavaScript提供交互性
Shiny使用Bootstrap包(与统计中的自助法Bootstrap无关),它可以很好地将页面在移动设备呈现。
2.1 Shiny应用的结构
ui.R文件
ui是用户界面,ui.R文件控制外观的所有样式元素。
server.R文件
server.R文件是设置环境的序言代码(仅执行一次)。
例:制作应用的用户界面
开始制作应用:
图1.开始在R中制作应用
在Rstudio中进入File,选择New File,接着选择Shiny Web App,会出现一个对话框。
图2.创建应用及ui.R文件和server.R文件
创建包含ui.R文件和server.R文件的应用myAPP。
图3.示例ui.R文件和server.R文件
在ui.R文件中ShinyUI函数控制整个用户界面。
・fluidPage函数描述用户界面的页面类型,生成响应式网页 所有组件放在fluidPage函数中,得到整个app的布局
・titlePanel函数设置用户界面的标题
・sidebarLayout函数将页面布局分为主要面板和侧边栏
sidebarPanel函数指定侧边栏的内容,默认在app左边> mainPanel函数指定主面板的内容,默认在app右边
运行应用:
- 直接点击上图右上角的Run App按键
图4.直接运行Run App 可以看到位于应用界面左边的侧边栏包含一个可调节的工具条,右边的主面板生成一个数据分布图。直接关闭页面即可退出应用。
- 切换到ui.R和server.R所在的工作环境再运行应用
setwd("~/Desktop")
runApp()
Listening on http://127.0.0.1:7895
也可以在Rstudio的工具栏中选择Session,点击Set Working Directory,再点击To Source File Location切换到ui.R和server.R所在的工作环境。
应用在Rstudio中运行,并返回一个URL,Shiny只是在电脑上创建了一个小型网络服务器以在本地运行和调试,网页应用是Rstudio的浏览器在访问这个网络服务器。
2.2 Shiny应用中的HTML标签
Shiny包中提供了几个包装函数可以在ui.R中使用HTML标签。
如
?builder
可以查看所有可以使用的HTML标签。
例:使用HTML标签
ui.R:
library(shiny)
shinyUI(fluidPage(
titlePanel("HTML Tags"),
sidebarLayout(
sidebarPanel(
h1("H1 Text"), #一级标题
h2("H2 Text"), #二级标题
h3("H3 Txet"), #三级标题
em("Emphasized Text") #斜体
),
mainPanel(
h3("Main Panel Text"),
code("Some Code!") #代码
)
)
))
图5.使用HTML标签可以使用HTML标签运行应用。
br
点击左上角的Open in Browser按键,可以在网页浏览器中打开。
图6.在网页浏览器中打开按下ctrl+u(option+command+u)可以显示网页源代码。
图7.显示网页源代码 可以看到加载出的HTML中的JavaScript样式。2.3 输入和输出
Shiny提供了许多输入方法,包括按钮、复选框、文本框等等,然后在R中进行计算,最后输出结果。
例:在用户界面创建一个滑条进行输入,然后将用户选择的滑条的数值传到服务器的函数,再将结果传送回到用户界面输出展示。
ui.R:
library(shiny)
shinyUI(fluidPage(
titlePanel("Slider App"),
sidebarLayout(
sidebarPanel( #创建滑条接受输入的滑条数值slider2
h1("Move the Slider!"),
sliderInput("slider2", "Slide Me!", 0, 100, 0)
),
mainPanel( #展示输出
h3("Slider Value:"),
textOutput("text1")
)
)
))
server.R:
library(shiny)
shinyServer(function(input, output){
output$text1 = renderText(input$slider2 + 10)
})
图8.使用滑条输入数据
shinyServer函数启用服务器函数,使用function(input, output)
定义接受输入参数和输出的函数,输入slider2,返回值作为output$text1,最后用ui.R展示。
2.4 创建交互性图表
默认情况下,在R中创建交互性图表比较困难,Shiny包极大增强了R在这方面的能力。
Shiny包为ui.R文件提供plotOutput函数输出图表,为server.R文件提供renderPlot函数创建图表。
ui.R:
library(shiny)
shinyUI(fluidPage(
titlePanel("Plot Random Numbers"), #标题
sidebarLayout(
sidebarPanel(
numericInput("numeric", "How Many Random Numbers Should be Plotted?",
value = 1000, min = 1, max = 1000, step = 1),
#滑条有两个滑轨,需要设置两头的数值
sliderInput("sliderX", "Pick Minimum and Maximun X Values",
-100, 100, value = c(-50, 50)),
sliderInput("sliderY", "Pick Minimum and Maximun Y Values",
-100, 100, value = c(-50, 50)),
#复选框
checkboxInput("show_xlab", "Show/Hide X Axis Label", value = TRUE),
checkboxInput("show_ylab", "Show/Hide Y Axis Label", value = TRUE),
checkboxInput("show_title", "Show/Hide Title", )
),
mainPanel( #主面板展示图形plot1
h3("Graph of Random Points"),
plotOutput("plot1")
)
)
))
server.R:
library(shiny)
shinyServer(function(input, output){
output$plot1 = renderPlot({ #创建plot1并返回到用户界面
set.seed(2016-05-25)
number_of_points <- input$numeric #输入创建的图中点的数量
minX <- input$sliderX[1] #X的最小值和最大值都是滑条的元素
maxX <- input$sliderX[2]
minY <- input$sliderY[1]
maxY <- input$sliderY[2]
dataX <- runif(number_of_points, minX, maxX) #生成随机数X
dataY <- runif(number_of_points, minY, maxY) #生成随机数Y
#input$show_xlab是复选框,通过判断真假决定显示或隐藏标签
xlab <- ifelse(input$show_xlab, "X Axis", "")
ylab <- ifelse(input$show_ylab, "Y Axis", "")
main <- ifelse(input$show_title, "Title", "")
plot(dataX, dataY, xlab = xlab, ylab = ylab, main = main,
xlim = c(-100, 100), ylim = c(-100, 100))
})
})
图9.创建交互性图表绘制随机数据
侧边栏中有一个增加或减少随机变量数量的操作框,两个改变分布范围的滑条,三个显示或隐藏轴标签或标题的复选框。
Shiny服务器总会去检查新的事项,改变这些选项,每次它得到一组新的值,它就将重新运行一切,并且重新显示结果,即在服务器和用户界面上来回交互。