14.9 R

R是一个面向统计分析和绘图的语言,是由新西兰奥克兰大学统计学系的Ross Ihaka和Robert Gentleman共同创立。R带有大量的统计软件包,如常见的贝叶斯推断、聚类分析、机器学习、空间统计、稳健统计等,在生物信息、统计学等领域应用广泛。

14.9 R - 图1

Rocker项目是一个Docker官方支持的项目,它提供了R语言的容器环境支持。官方提供的r-base镜像就是基于Rocker项目的。

1.运行交互式R语言环境

可以直接运行官方提供的r-base镜像,进入交互模式的R环境:


  1. $ docker run -ti --rm r-base

退出交互命令行时,可以使用quit()指令,此时可以选择是否保存工作空间:


  1. > quit()
  2. Save workspace image? [y/n/c]:

2.运行R语言批量模式

可以通过连接工作目录,来运行R语言的批量指令。把一个卷(volume)连接至容器时,最好使用一个非根用户,这样可以避免权限问题:


  1. $ docker run -ti --rm -v "$PWD":/home/docker -w /home/docker -u docker r-base R
  2. CMD check .
  3. * using log directory ‘/home/docker/..Rcheck
  4. * using R version 3.3.0 (2016-05-03)
  5. * using platform: x86_64-pc-linux-gnu (64-bit)
  6. * using session charset: UTF-8
  7. * checking for file ‘./DESCRIPTION ... NO
  8. * DONE
  9. Status: OK

3.运行R语言命令行模式

可以直接进入R容器的bash命令行:


  1. $ docker run -ti --rm r-base bash
  2. root@4a0bba3f4cb4:/#

在bash中如果希望进入R语言交互命令行,可以直接输入R:


  1. root@4a0bba3f4cb4:/bin# R
  2. >

可以使用vim.tiny编辑器,新建r-demo.R脚本:


  1. print("Hello,World!")

保存后,就可以使用Rscript指令运行此脚本:


  1. root@4a0bba3f4cb4:/bin# Rscript demo.R
  2. Rscript demo.R
  3. [1] "Hello,World!"

还可以在R语言交互命令行中运行R脚本。首先,在容器中新建hi.R脚本:


  1. hello <- function( name ) {
  2. sprintf( "Hello, %s", name );
  3. }

然后直接输入R指令进入交互命令行,使用source()函数加载脚本,再使用hello()函数调用用户的打印逻辑:


  1. > source('/bin/hi.R')
  2. > hello('docker')
  3. [1] "Hello, docker"
  4. >

4.使用自定义容器

在用户将手头的R项目容器化的过程中,往往需要加入自己的环境构建逻辑,也需要运行自定义容器。这种情况下,用户就需要基于官方提供的r-base基础镜像,完成自定义的Dockerfile,例如:


  1. FROM r-base:latest
  2. COPY . /usr/local/src/r-scripts
  3. WORKDIR /usr/local/src/r-scripts
  4. CMD ["Rscript", "running-r-scripts.R"]

其中running-r-scripts.R内容可以简写为:print("My R Container!")然后,使用docker build指令构建:


  1. $ docker build -t my-r-container /directry/of/Dockerfile

然后使用docker run指令运行容器,并通过docker ps指令查看运行状态:


  1. $ docker run -d my-r-container
  2. e86739e8226a081372d9bb0fb9f62a32405814b5172a543487b0751839c2e57f
  3. docker ps -a
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
  5. e86739e8226a my-r-container "Rscript running-r-sc" ..ago Exited (0)