作者:张丹
R语言中文社区专栏特邀作者,《R的极客理想》系列图书作者,民生银行大数据中心数据分析师,前况客创始人兼CTO
博客专栏:http://blog.fens.me/
前言
无意中发现了AWS的提供免费的服务器资源,必须要大赞一下,写篇文章大大的推广。
Shiny是R语言中一个神级的应用,唯一的缺点就是不支持并发。所以,我们很多时候都是做本地Shiny应用,用于展示各种报表的效果。但有时候也需要把报表上传到互联网上,其他人也能看到。这样就需要一个互联网的解决方案,刚好AWS有了免费的服务器支持。简直是完美!!
目录
-
Shiny是什么?
-
本地开发一个Shiny小应用
-
申请AWS免费服务器
-
在AWS上安装R语言环境
-
在AWS上安装Shiny Server
-
在AWS上部署自己的Shiny应用
1. Shiny是什么?
Shiny是RStudio公司开发的,一个用于R语言的Web应用程序框架,可以轻松开发交互式web应用,不需要了解HTML, CSS, JS等前端知识。
Shiny构建出应用的惊艳程度,远远超过了说明的文字。一定要学学,下面是一个Shiny小程序的截图。
Shiny的主页:http://shiny.rstudio.com/
我们安装Shiny可以直接从CRAN获取,通过一行R程序就可以安装了。
~ R
> install.packages("shiny")
2. 本地开发一个Shiny小应用
下面我们用Shiny开发一个小应用的实例,主要是为介绍Shiny的用法,包括网页的界面UI和后端程序,数据源使用R语言自带的一个数据集。
数据集是faithful,统计的是美国黄石国家公园的泉水(Old Faithful geyser) 喷发的持续时间和喷发等待时间 。
包括2列,eruptions为喷发持续时间,waiting为喷发的等待时间。
> head(faithful,20)
eruptions waiting
1 3.600 79
2 1.800 54
3 3.333 74
4 2.283 62
5 4.533 85
6 2.883 55
7 4.700 88
8 3.600 85
9 1.950 51
10 4.350 85
11 1.833 54
12 3.917 84
13 4.200 78
14 1.750 47
15 4.700 83
16 2.167 52
17 1.750 62
18 4.800 84
19 1.600 52
20 4.250 79
开发环境所使用的系统环境
Shiny应用,分为定义了客户端程序ui.R,和服务器端程序server.R,这2个文件默认要求放同一个目录中。另外,我们还需要一个启动文件run.R,用于启动Shiny的应用。当然,如果在RStudio中开发,就不需要run.R的文件,直接点Shiny应用的启动按钮就行了。
开始创建项目目录和文件。
~ cd D:\workspace\dash
~ mkdir demo1
~ notepad run.R
~ cd demo1
~ notepad server.R
~ notepad ui.R
目录结构如下:
D:\workspace\dash
|
|
|
|
编辑文件:run.R
library("shiny")
runApp("./demo1",host='127.0.0.1',port=3840)
编辑文件:server.R
library(shiny)
shinyServer(function(input, output) {
output$main_plot
hist(faithful$eruptions,
probability = TRUE,
breaks = as.numeric(input$n_breaks),
xlab = "持续时间",
main = "喷发持续时间")
if (input$individual_obs) {
rug(faithful$eruptions)
}
if (input$density
) {
dens $eruptions, adjust = input$bw_adjust)
lines(dens, col = "blue")
}
})
})
编辑文件:ui.R
library(shiny)
shinyUI(bootstrapPage(
headerPanel("第一个Shiny应用"),
# 左侧布局
sidebarPanel(
# 下拉框
selectInput(inputId = "n_breaks",label = "直方图中的分隔数",choices = c(10, 20, 35, 50),selected = 20),
# 单选框
checkboxInput(inputId = "individual_obs",label = strong("实际观察点"),value = FALSE),
# 单选框
checkboxInput(inputId = "density",label = strong("密度估计曲线"),value = FALSE)
),
# 主布局
mainPanel(
plotOutput(outputId = "main_plot", height = "300px"),
conditionalPanel(condition = "input.density == true",
sliderInput(inputId = "bw_adjust",label = "带宽调整", min = 0.2, max = 2, value = 1, step = 0.2)
)
)
))
启动Shiny应用时,本地的3840端口,就被打开了。
~ D:\workspace\dash>R -f run.r
R version 3.2.3 (2015-12-10) -- "Wooden Christmas-Tree"
Copyright (C) 2015 The R Foundation for Statistical Computing
Platform: x86_64-w64-mingw32/x64 (64-bit)
R
'license()''licence()'
R.
'contributors()'
'citation()'RR
'demo()''help()'
'help.start()'HTML
'q()'R.
> library("shiny")
> runApp("./demo1",host='127.0.0.1',port=3840)
Listening on http://127.0.0.1:3840
我们可以用浏览器,来访问本地的服务 http://127.0.0.1:3840 。
这是一个标准的Web网页,如果我们操作网页上的表单元素,对应该的数据也会发生变化了。这样我们就完成了一个本的Shiny的小应用的开发,接下来就是把这个程序部署到AWS上面了。
3. 申请AWS免费服务器
AWS是Amazon提供的一个云服务平台,利用亚马逊 AWS,软件开发人员可以轻松购买计算、存储、数据库和其他基于 Internet 的服务来支持其应用程序。开发人员能够灵活选择任何开发平台或编程环境,以便于其尝试解决问题。由于开发人员只需按使用量付费,无需前期资本支出,亚马逊 AWS 是向最终用户交付计算资源、保存的数据和其他应用程序的一种最经济划算的方式。
AWS有一个免费的套餐,让互联网用户可以免费的使用他的资源,包括了服务器,数据库,CDN,负载均衡等服务。我们为了部署自己的Shiny应用,可以申请免费的服务器资源,先跑一下,看看效果。
首先,你需要注册一个AWS账号,然后登录进去,选择地区,申请免费的服务器。目前免费开放的区域不包括中国区,我选择了一个日本东京的服务器,Ubuntu Linux 64bit。
免费的资源,有一些限制,只能1核心CPU,1G内存,最大30G存储等。当然了,有免费的资源,已经是很棒的了,而且是AWS的服务。
接下来,就是做资源配置,然后就可以启动服务器了。
大概等3分钟,服务器启动完成,然后就可以通过SSH进行访问了。
AWS为了保证安全性,建议使用秘钥访问,而不是直接的用户名和密码的方式,所以你需要创建一个秘钥对,下载一个xx.pem的私钥,然后配到Putty或XShell等用于远程登录的客户端里。
然后,就可以用XShell连接,免费创建的EC2的服务器了。在这里,如果是Ubuntu的Linux服务器,用户名需要使用ubuntu,不能直接设置root。
4. 安装R语言环境
登录后,我们就可以安装R语言的环境了。安装过程比较简单,如果你需要装指定版本的R软件,那么你需要参考文章,R的历史版本安装。如果是安装默认版本的R语言环境,直接使用是apt-get命令就是最方便的。
服务器所使用的系统环境
我们先更新apt的软件源,安装必备的系统软件,包括r-base和git,以及的Shiny应用的依赖库libcurl4-openssl-dev,libxml2-dev。如果你忘了装了,后面再装也都不影响。
~ sudo apt-get update
~ sudo apt-get install r-base
~ sudo apt-get install git
~ sudo apt-get install libcurl4-openssl-dev
~ sudo apt-get install libxml2-dev
接下来,让我们安装R语言的依赖包。这里有一个小技巧,就是在R语言的环境中安装第三方R包,并切换成root用户。
~ sudo -i # 切换成root用户
~ R # 启动R语言环境
我们需要预装的包,主要就是shiny,当然如果你还有依赖其他的包,都可以一块安装。安装时,R会让我们选择软件源,如果用https协议的镜像列表,你需要配置一下curl进行下载。你依然可以选择用http协议的镜像列表,选61之后,会出现http的镜像列表。
我们的服务器在Tokyo,所以也选择Tokyo的镜像列表,然后开始下载R的第三方软件包。
# 安装包
> install.packages("shiny")
Installing package into ‘/usr/local/lib/R/site-library’
(as ‘lib’ is unspecified)
--- Please select a CRAN mirror for use in this session ---
HTTPS CRAN mirror
1: 0-Cloud [https] 2: Algeria [https]
3: Australia (Canberra) [https] 4: Australia (Melbourne) [https]
5: Australia (Perth) [https] 6: Austria [https]
25: France (Montpellier) [https] 26: France (Paris 2) [https]
27: Germany (Göttingen) [https] 28: Germany (Münster) [https]
29: Greece [https] 30: Iceland [https]
31: India [https] 32: Indonesia (Jakarta) [https]
33: Ireland [https] 34: Italy (Padua) [https]
35: Japan (Tokyo) [https] 36: Malaysia [https]
61: (HTTP mirrors)
Selection: 61
HTTP CRAN mirror
1: 0-Cloud 2: Algeria
3: Argentina (La Plata) 4: Australia (Canberra)
5: Austria 6: Belgium (Antwerp)
7: Belgium (Ghent) 8: Brazil (BA)
9: Brazil (PR) 10: Brazil (RJ)
11: Brazil (SP 1) 12: Brazil (SP 2)
13: Bulgaria 14: Canada (BC)
37: Hungary 38: Iceland
39: India 40: Iran
41: Ireland 42: Italy (Milano)
43: Italy (Padua) 44: Italy (Palermo)
45: Japan (Tokyo) 46: Korea (Seoul 1)
47: Korea (Seoul 2) 48: Korea (Ulsan)
89: USA (TX 1) 90