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

Rocker项目是一个Docker官方支持的项目,它提供了R语言的容器环境支持。官方提供的r-base镜像就是基于Rocker项目的。
1.运行交互式R语言环境
可以直接运行官方提供的r-base镜像,进入交互模式的R环境:
- $ docker run -ti --rm r-base
退出交互命令行时,可以使用quit()指令,此时可以选择是否保存工作空间:
- > quit()
- Save workspace image? [y/n/c]:
2.运行R语言批量模式
可以通过连接工作目录,来运行R语言的批量指令。把一个卷(volume)连接至容器时,最好使用一个非根用户,这样可以避免权限问题:
- $ docker run -ti --rm -v "$PWD":/home/docker -w /home/docker -u docker r-base R
- CMD check .
- * using log directory ‘/home/docker/..Rcheck’
- * using R version 3.3.0 (2016-05-03)
- * using platform: x86_64-pc-linux-gnu (64-bit)
- * using session charset: UTF-8
- * checking for file ‘./DESCRIPTION’ ... NO
- * DONE
- Status: OK
3.运行R语言命令行模式
可以直接进入R容器的bash命令行:
- $ docker run -ti --rm r-base bash
- root@4a0bba3f4cb4:/#
在bash中如果希望进入R语言交互命令行,可以直接输入R:
- root@4a0bba3f4cb4:/bin# R
- >
可以使用vim.tiny编辑器,新建r-demo.R脚本:
- print("Hello,World!")
保存后,就可以使用Rscript指令运行此脚本:
- root@4a0bba3f4cb4:/bin# Rscript demo.R
- Rscript demo.R
- [1] "Hello,World!"
还可以在R语言交互命令行中运行R脚本。首先,在容器中新建hi.R脚本:
- hello <- function( name ) {
- sprintf( "Hello, %s", name );
- }
然后直接输入R指令进入交互命令行,使用source()函数加载脚本,再使用hello()函数调用用户的打印逻辑:
- > source('/bin/hi.R')
- > hello('docker')
- [1] "Hello, docker"
- >
4.使用自定义容器
在用户将手头的R项目容器化的过程中,往往需要加入自己的环境构建逻辑,也需要运行自定义容器。这种情况下,用户就需要基于官方提供的r-base基础镜像,完成自定义的Dockerfile,例如:
- FROM r-base:latest
- COPY . /usr/local/src/r-scripts
- WORKDIR /usr/local/src/r-scripts
- CMD ["Rscript", "running-r-scripts.R"]
其中running-r-scripts.R内容可以简写为:print("My R Container!")然后,使用docker build指令构建:
- $ docker build -t my-r-container /directry/of/Dockerfile
然后使用docker run指令运行容器,并通过docker ps指令查看运行状态:
- $ docker run -d my-r-container
- e86739e8226a081372d9bb0fb9f62a32405814b5172a543487b0751839c2e57f
- docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
- e86739e8226a my-r-container "Rscript running-r-sc" ..ago Exited (0)
