WSL Debian 9にR言語 v4.0.2をインストールする


julia言語からR言語を呼び出すライブラリ`RCall.jl`を使用するために、最新版をソースからインストールした時の個人用メモ。`apt install` で追加できる R v3.3.3 はライブラリ`RCall.jl`の要求バージョン未満だったので、最新版をソースからビルドしたのだが、かなり苦戦したので、記事に残すことにした。
この記事が私と同じ状況にある人の助けになれば幸いである。

以下の公式ドキュメントでは Other methods として、ソースからコンパイルする方法が紹介されている。
http://juliainterop.github.io/RCall.jl/stable/installation/



## 環境
いくつかのコマンド出力を貼っておく。

```bash:terminal
$ uname -s -r -v -m -o
Linux 4.19.104-microsoft-standard #1 SMP Wed Feb 19 06:37:35 UTC 2020 x86_64 GNU/Linux
$ cat /etc/issue
Debian GNU/Linux 9 \n \l
$ cat /etc/debian_version
9.12
$ julia --version
julia version 1.0.5
```



## インストール手順
### **最新バージョンの R言語 をダウンロード**
https://cran.r-project.org/src/base/R-4
執筆時の最新バージョンである R-4.0.2.tar.gz を上記ページから取得。
本文で登場するファイル名は適宜読み替えること。

### **ダウンロードしたファイルを解凍して適当な場所に移動**


```bash
$ tar xf R-4.0.2.tar.gz
$ sudo mv R-4.0.2/ /root
```
`tar`で生成したディレクトリが`/root/R-4.x.x/`にある前提で以下の説明を読み進めてほしい。


### **足りないライブラリを追加する**
`./configure`に怒られつつ追加していったもののまとめ。
それなりに試行錯誤したところ。参考にしたWebサイトを列挙するのはやめておく。
ここらへん、不要なものまで追加しているかもしれないが、その点はご容赦願いたい。
コメント欄で知らせていただければなお幸いである。

```bash
$ sudo apt install gfortran gcc f2c libreadline-dev zlib1g zlib1g-dev bzip2 lbzip2 libbz2-1.0 libbz2-dev liblzma5 liblzma-dev libpcre2-dev libpcre2-8-0 libpcre2-16-0 libpcre2-32-0 libcurl4-gnutls-dev
```



### **GUIを有効化するためのライブラリを追加する**
最初は`xorg` `x11-common`だけを追加して`./configure`してみたが、次のようなエラーを吐いて上手くいかなかった。

```bash:terminal
configure: error: --with-readline=yes (default) and headers/libs are not available
```

ので、一度目は`--with-x=no`オプションをつけて`configure`してみた。
結論から言うとこれはミスで、安易にこのオプションをつけてコンパイルしたところ、インストール自体は成功するものの、その正体はグラフ描画機能が使えない残念なRである。

結論：`libxt-dev`を追加すれば、`--with-x=no`オプションを外すことができる。
次のコマンド行はもともと私の環境にてインストール済だったパッケージも含めて記述してある。

```bash
$ sudo apt install xorg x11-apps x11-common x11-utils x11-xserver-utils libxt-dev
```
> お気持ちメモ：
> [オフラインでのR環境構築 on RHEL](https://qiita.com/tomotagwork/items/9e86d2fc67a7c7b644d5) を読んで`libxt-dev`が必要という認識に至る。必要なXのライブラリを突き止めるのに、この記事に出会うまで本当に長い時間がかかった。
`--with-x=no`オプションなしで`./configure`成功したときは思わず叫んだ。


### **configure; make && make install**
以下の手順では`/usr/local`以下にインストールされる。
インストール先を変更したい場合は`--prefix=/usr/local`の部分を適宜書き換えてほしい。

```bash
$ su -
[root]のパスワード：
# 以下の % プロンプトは root権限で実行
% ls ~
R-4.0.2
% cd R-4.0.2/
% ./configure --prefix=/usr/local --enable-R-shlib
```

**`--enable-R-shlib`のフラグは必須**。このオプションをつけ忘れてしまうと、`/usr/local/lib/R/lib/libR.so`が生成されないため、`RCall.jl`が動かない。

`./configure`の結果筆者の環境では次のような出力が得られた。

```bash
R is now configured for x86_64-pc-linux-gnu

  Source directory:            .
  Installation directory:      /usr/local

  C compiler:                  gcc   -fPIC
  Fortran fixed-form compiler: gfortran  -g -O2

  Default C++ compiler:        g++ -std=gnu++11   -fPIC
  C++14 compiler:              g++ -std=gnu++14   -fPIC
  C++17 compiler:
  C++20 compiler:
  Fortran free-form compiler:  gfortran  -g -O2
  Obj-C compiler:

  Interfaces supported:        X11
  External libraries:          pcre2, readline, curl
  Additional capabilities:     NLS
  Options enabled:             shared R library, shared BLAS, R profiling

  Capabilities skipped:        PNG, JPEG, TIFF, cairo, ICU
  Options not enabled:         memory profiling

  Recommended packages:        yes

configure: WARNING: you cannot build info or HTML versions of the R manuals
configure: WARNING: you cannot build PDF versions of the R manuals
configure: WARNING: you cannot build PDF versions of vignettes and help pages
```
`Interfaces supported:        X11`と` Options enabled:             shared R library`を今一度確認する。
RのマニュアルまわりのWARNINGが出ているが、無視した。気に入らなければ`less config.log`して"WARNING"とか"ERROR"といった文字列を検索して周辺のメッセージを参考にする。

これが2,3度目の挑戦という読者におかれては、必ず`make clean`した後に、次の手順を踏んでほしい。

```bash
% make && make install
```

**コーヒーを淹れる**
気長に待つ。コーヒーを飲み終えたらrootを抜ける。
X Window Server が未設定ならばここで付録の手順を先に実施するとよい。

### **juliaに`RCall.jl`を追加する**
通常通りPkg.add("RCall") して Pkg.precompile するとエラーが表示された。

```julia:juliaREPL
# Try adding /usr/local/lib/R/lib to the "LD_LIBRARY_PATH" environmental variable
```

このインストール方法ではあらかじめRのパスをjuliaに教えないとダメらしい。（冒頭のページに書いてある）
`/usr/local`は読者において適宜読み替えるとして、次の一行を`~/.bash_aliases`に追記しておく。

```bash:~/.bash_aliases
export LD_LIBRARY_PATH='/usr/local/lib/R/lib'
```

後は普通にパッケージ追加するだけだ。

```julia:juliaREPL
julia> ]
(v1.0) pkg> add RCall
(v1.0) pkg> precompile
```



### **動作の確認**

`$`と打つとRのREPLモードに入ることができるとのこと。

```julia:juliaREPL
julia> using RCall
julia> $
R> library(datasets)
R> plot(iris)
```

グラフが表示されたらインストールは成功だ。




## **付録：WSL 2 における X Server の使用**
こちらは記事の最後に記載しているはてなブログと次の Issue を全面的に参考にさせていただきました。
[Can't use X-Server in WSL 2 #4106](https://github.com/microsoft/WSL/issues/4106)

`~/.bash_aliases`に以下の一行を追記。
WSL 2 に割り当てられたIPアドレスは毎回変化するらしく、ワンライナーで取得するのが安定。

```bash:~/.bash_aliases
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0
```

Windows 10 側で Windowsキー + X, (N) で「設定」を開き、「Windows ファイアウォールによるアプリケーションの許可」において VcXsrv Windows Xserver を追加し、プライベート/パブリック両方で許可する。

~~参考にしたサイトではこれで動いたそうなのだが、私の方ではもうひとつ手順を追加した。設定ファイル `C:\Program Files\VcXsrv\X0.hosts` に一行追記して以下のように記述する：~~
~~X0.hosts 
172.0.0.0 - 172.255.255.255~~

2020.07.06 追記
WSLにログインし直したら上の方法では必ずしも上手く行かなかった。
VcXsrv の XLaunch 実行時に Addicional parameters for VcXsrv 欄に`-ac`と指定する方法で対応している。

以上。

**参考サイト**
https://qiita.com/tomotagwork/items/9e86d2fc67a7c7b644d5
https://odaryo.hatenablog.com/entry/2020/01/08/114846

## 変更履歴
2020.07.06　「付録：WSL 2 における X Server の使用」の修正