如何0基础部署R的shiny app

过者之患,不知而自以为知。

Posted by Chevy on December 10, 2019

Why we need visualization by web

目前的单细胞实验文章,大家都会习惯把自己的数据做成一个数据库的形式,方便读者进行检索,那么(零基础的)我们该如何做一个网站来展示我们的数据结果呢?

例如我知道身边的洲更同学就做了两个工具网站,美观且实用,有兴趣的大家可以点进去一览究竟:

  1. BSA

  2. RNA-seq

Which tools to use

作为一个R语言的使用者,我很庆幸前人在此领域已经进行了极大的开拓,Rstudio的工作人员开发了shiny这个包来进行数据的交互可视化,并且我们可以将其部署到server上与读者进行分享

当然,本次课程的目的不是教你怎么用shiny写app,毕竟Rstudio上的教程已经写的很清楚了,并且Rstudio官方就给出了很多的示例以及在showmeshiny里也有很多包含了code的示例app

所以本次介绍的是(零基础的)我们使用shiny开发一个工具网页

What do you need to build a shiny web

a server or some money

事实上,用户可以在自己的PC上就可以完成一个shiny app的编写,但是问题就在于当你运行shiny以后,你打开浏览器是监听本地端口的,别人没有访问你电脑的权限,所以你是没有办法让别人看到你的数据或者使用你编写的工具的,在这种情况下,你可以拥有两个基本选项:

  1. 将你的shiny app以代码的形式分享给别人
    • 优点:简单,只需要代码传输就可以了,例如GitHub
      • 可以使用runUrl, runGithub, runGist等函数获取在线app
    • 缺点:需要别人会用R(如果有大的数据量的话,就会比较麻烦)
  2. 将你的shiny app以网页的形式分享给别人
    • 有点:友好的交互形式,只要有网就可以查看数据或者使用工具
    • 缺点:你需要有一点基本的网页配置知识和一些硬件

我们的选择是2,让别人无门槛的访问我们的shiny app

那么,将你的shiny app以网页的形式分享给别人需要哪些硬件呢?

  • 一台联网的服务器
  • shiny app代码编写及测试的能力
  • 一个善于尝试及摸索的大脑

以上三个条件的重要性依次递增

By which way could we build a shiny web

目前有三种方法可以到达我们的目的,依次为:

  1. 【可能是最简单的白嫖方法】使用shiny官方出版的shiny app托管服务即shinyapps.io,无需你配置服务器以及设置参数,只需要点点鼠标,上传你的shiny app就可以啦,而且免费账户就有可能满足你的需求了(免费托管五个app aplications),白嫖万岁(再不行就花点钱,哪怕*呢)
  2. 【高阶用户的首选】使用RStudio Connect,如果你是营利性的目的,并且数据不准备公开(密码登录授权等),那么RStudio Connect可能是你需要考虑使用的
  3. 【绝不认输的救赎之路】如果你想折腾,又有自己的服务器,那么使用shiny server去发布你的shiny app一定是不二之选

Pipeline for publish a web on server

我使用的为小型VPS,配置不高但是够用,同时拥有root权限

首先是Download Shiny Server,不同的系统有不同的下载方式,我使用的是CentOS 7,大家根据官网教程操作就可以了:

# 安装EPEL
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# 安装R
sudo yum install R
# 安装shiny
sudo su - -c "R -e \"install.packages('shiny', repos='https://cran.rstudio.com/')\""
# 或者在Linux内进入R,手动安装shiny及其依赖包

# 随后下载shiny server并安装
wget https://download3.rstudio.org/centos6.3/x86_64/shiny-server-1.5.12.933-x86_64.rpm
sudo yum install --nogpgcheck shiny-server-1.5.12.933-x86_64.rpm

到这一步你就已经完成了shiny server的配置(可能会出一些安装上的小麻烦,但是见山开路,遇水搭桥,解决问题是提升自己的必由之路)

随后你可以将你的shiny app上传到服务器的 /srv/shiny-server/位置,打开浏览器,输入服务器的IP监听端口及包名就🆗了,格式为http://<hostname>:3838/APP_NAME/,代码演示:

# 自带示例文件演示
cp -R /your-path-wo-shiny/shiny/examples/* /srv/shiny-server/

# 我的数据
(base)  ⚡ root@Chevy  ~  cd /srv/shiny-server 
(base)  ⚡ root@Chevy  /srv/shiny-server  ll
total 44K
drwxr-xr-x 2 root root 4.0K Dec  4 04:21 01_hello
drwxr-xr-x 2 root root 4.0K Dec  4 04:21 02_text
drwxr-xr-x 2 root root 4.0K Dec  4 04:21 03_reactivity
drwxr-xr-x 2 root root 4.0K Dec  4 04:21 04_mpg
drwxr-xr-x 2 root root 4.0K Dec  4 04:21 05_sliders
drwxr-xr-x 2 root root 4.0K Dec  4 04:21 06_tabsets
drwxr-xr-x 2 root root 4.0K Dec  4 04:21 07_widgets
drwxr-xr-x 3 root root 4.0K Dec  4 04:21 08_html
drwxr-xr-x 2 root root 4.0K Dec  4 04:21 09_upload
drwxr-xr-x 2 root root 4.0K Dec  4 04:21 10_download
drwxr-xr-x 2 root root 4.0K Dec  4 04:21 11_timer
lrwxrwxrwx 1 root root   38 Dec  4 04:20 index.html -> /opt/shiny-server/samples/welcome.html
lrwxrwxrwx 1 root root   37 Dec  4 04:20 sample-apps -> /opt/shiny-server/samples/sample-apps

Example

我的测试结果,可点击(比较慢,小水管VPS)

Chevy’s shiny example