CentOS6.9にRenvでRの仮想環境を作る


## はじめに

Rの仮想環境を使いたいので[Renv](https://github.com/viking/Renv)をインストールしました。
その時の手順メモ。

そもそもの目的は、spark 2.2.0をR付きでビルドすることだったのですが、SparkRで使用するR (3.3.2)と、ビルド環境のR (3.4.2)が異なっており、起動するとエラーになってしまうため、ビルド環境にR 3.3.2をインストールする必要がありました。

そこで、Renvを使えば簡単に任意のバージョンで仮想環境を作れそうだったのでやってみました。


## 手っ取り早くインストールしたい人へ

Gistにスクリプト置いときます。
自己責任でどうぞ。

[install-Renv.sh](https://gist.github.com/tommarute/60c57f4175a3732636d506ea5fd2e689)


## 環境

* OS: CentOS6.9
* CPUs:4
* Memory: 8GB


## インストールするもの

* Renv: https://github.com/viking/Renv
	* Rの仮想環境管理ツール。基本的な機能は[pyenv](https://github.com/pyenv/pyenv)などと同じですが、Renv単体ではRのInstallができません。
* R-build: https://github.com/viking/R-build
	* RenvからRをインストールできるようにするPlugin。


## 手順

### Install Renv

基本READMEに書いてある通りです。

```
$ git clone https://github.com/viking/Renv.git .Renv
$ echo 'export PATH="$HOME/.Renv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(Renv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
$ Renv versions
```

### Install R-build

こちらもREADMEのまま。

```
$ mkdir -p ~/.Renv/plugins
$ cd ~/.Renv/plugins
$ git clone https://github.com/viking/R-build.git
```

## Install dependencies

依存するパッケージをインストールします。
CentOS6.9にyumでインストールできるパッケージはバージョンが古いので、ソースからビルドします。
これが面倒臭かった。

* ソースファイルのダウンロード先: `$HOME/src`
* ライブラリのインストール先: `$HOME/local`


### 必要なソースファイルをダウンロード

```
$ wget https://jaist.dl.sourceforge.net/project/libpng/zlib/1.2.11/zlib-1.2.11.tar.gz -P $HOME/src

$ wget http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz -P $HOME/src

$ wget https://tukaani.org/xz/xz-5.2.3.tar.gz -P $HOME/src

$ wget https://jaist.dl.sourceforge.net/project/pcre/pcre/8.40/pcre-8.40.tar.gz -P $HOME/src

$ wget https://curl.haxx.se/download/curl-7.52.1.tar.gz -P $HOME/src

$ wget http://cran.r-project.org/src/base/R-3/R-3.3.2.tar.gz -P $HOME/src
```

### 各tar ballを展開

一気にいきましょう。

```
$ cd $HOME/src
$ ls | xargs -n 1 -IFILE tar xzvf FILE
```

### Install zlib

```
$ cd $HOME/src/zlib-1.2.11
$ ./configure --prefix=$HOME/local | tee configure.log
$ make -j 4 | tee make.log
$ make install -j 4 | tee make-install.log
```

### Install bzip2

```
$ cd $HOME/src/bzip2-1.0.6
$ cp Makefile Makefile.org
$ sed -i 's/CFLAGS=-Wall/CFLAGS=-fPIC -Wall/' Makefile
$ make clean
$ make -j 4 | tee make.log
$ make install -j 4 PREFIX=$HOME/local | tee make-install.log
```

### Install xz

```
$ cd $HOME/src/xz-5.2.3
$ ./configure --prefix=$HOME/local | tee configure.log
$ make -j 4 | tee make.log
$ make install -j 4 | tee make-install.log
```

### Install pcre

```
$ cd $HOME/src/pcre-8.40
$ ./configure --prefix=$HOME/local --enable-utf8 | tee configure.log
$ make -j 4 | tee make.log
$ make install -j 4 | tee make-install.log
```

### Install curl

```
$ cd $HOME/src/curl-7.52.1
$ ./configure --prefix=$HOME/local | tee configure.log
$ make -j 4 | tee make.log
$ make install -j 4 | tee make-install.log
```

### Install R 3.3.2

本来はR-buildを使って様々なバージョンのRをインストールできるはずだったのですが、今回必要だったR 3.3.2のconfigureスクリプトに[バグ](http://r.789695.n4.nabble.com/Bug-with-zlib-version-checking-for-zlib-gt-1-2-10-R-version-3-3-2-td4728816.html)があって、`Renv install 3.3.2`としてもエラーになってしまいます。
仕方がないのでマニュアルインストールします。

```bash
$ echo 'export CPPFLAGS="-I$HOME/local/include"' >> ~/.bash_profile
$ echo 'export LDFLAGS="-L$HOME/local/lib"' >> ~/.bash_profile
$ echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/local/lib' >> ~/.bash_profile
$ source ~/.bash_profile
$ cd $HOME/src/R-3.3.2
$ cp configure configure.org

$ vim configure
# Modify it!
# -  exit(strncmp(ZLIB_VERSION, "1.2.5", 5) < 0);
# +  exit(strncmp(ZLIB_VERSION, "1.2.5", 5) < 0 && (strlen(ZLIB_VERSION) < 6 || strncmp(ZLIB_VERSION, "1.2.10", 6) < 0));

$ ./configure --prefix=$HOME/.Renv/versions/3.3.2 --with-cairo --with-jpeglib --with-readline --with-tcltk --with-blas --with-lapack --enable-R-profiling --enable-R-shlib --enable-memory-profiling | tee configure.log
$ make -j 4 | tee make.log
$ make install -j 4 | tee make-install.log
```

### 動作確認

```
$ Renv versions
* 3.3.2 (set by /home/tommarute/.Renv-version)
$ R --version | head -n 1
R version 3.3.2 (2016-10-31) -- "Sincere Pumpkin Patch"
```

3.3.2の環境を作れました。

### ちなみに

今回のようなバグに当たらなければ、R-buildで簡単インストールができるので、そちらも載せておきます。

なお、ビルドはお茶できるくらい時間がかかりますので、気長に待ちましょう。

```
$ time Renv install 3.4.0
Downloading http://cran.r-project.org/src/base/R-3/R-3.4.0.tar.gz...
Installing R-3.4.0...
Installed R-3.4.0 to /home/tommarute/.Renv/versions/3.4.0

real    6m9.461s
user    7m52.355s
sys     0m28.685s
$ Renv versions
* 3.3.2 (set by /home/tommarute/.Renv-version)
  3.4.0
$ Renv shell 3.4.0
$ R --version | head -n 1
R version 3.4.0 (2017-04-21) -- "You Stupid Darkness"
```

## おわりに

RenvとR-buildを使ってRの仮想環境を作りました。
最近はなんでも仮想環境あって便利ですね。
[anyenv](https://github.com/riywo/anyenv)も使ってみたいです。