はじめに
R の tidyverse
パッケージ群を含む docker イメージとして rocker/tidyverse
が有名です。ただし、これらのイメージは(恐らく)RStudio を使用する前提で作成されています。
私は RStudio を使用しておらず、以下のような経緯もあってコンテナ内の R でプロットを表示させる方法を調べてみました。
- R のパッケージのバージョンを固定したい
-
tidyverse
パッケージ群のインストールは時間がかかる -
rockerjp/tidyverse
を使用すれば、自分で大量のパッケージをインストールしなくてすむため便利だろう - コンテナ内の R でプロットを表示させたい
参考URL
これらのリンク先の設定と比較すると項目が少ないですが、恐らく使用した R のコンテナ内で設定されているからと思います。
実例その1:r-base
イメージの場合
まず、R の公式イメージである r-base
で試しました。試行錯誤した後の結果を示します。
設定項目
-
-u docker
- これを指定しないとプロットが表示されませんでした
-
-e DISPLAY=$DISPLAY
および-v /tmp/.X11-unix:/tmp/.X11-unix
- 参考記事を参照
docker run --rm -it \
-u docker \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
r-base R
boxplot(iris$Sepal.Length ~ iris$Species)
プロットされました。
実例その2:rockerjp/tidyverse
イメージの場合
とりあえずチャレンジ
先程と異なり、ユーザー名は rstudio
とします(元々のイメージ内で指定されています)。
docker run --rm -it \
-u rstudio \
-e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix \
rockerjp/tidyverse R
> boxplot(iris$Sepal.Length ~ iris$Species)
Error in (function (display = "", width, height, pointsize, gamma, bg, :
X11 module cannot be loaded
In addition: Warning message:
In grSoftVersion() :
unable to load shared object '/usr/local/lib/R/modules//R_X11.so':
libXt.so.6: cannot open shared object file: No such file or directory
このようにエラーが出てしまい、プロットされませんでした。
libXt.so.6
が不足しているようです。
libxt6
パッケージを追加したイメージの場合
そこで、以下のような Docker ファイルを用意しました。
FROM rockerjp/tidyverse:latest
RUN apt-get update \
&& apt-get install -y libxt6
ビルドします。イメージ名は仮に mytidyverse
とします。
docker build -t mytidyverse .
docker run --rm -it \
-u rstudio \
-e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix \
mytidyverse R
boxplot(iris$Sepal.Length ~ iris$Species)
図は省略しますが今度はプロットされました。
tidyverse
がインストールされているので ggplot2
でも試してみます。
library(ggplot2)
ggplot(iris, aes(Species, Sepal.Length)) +
geom_boxplot()
これもプロットされました。
おわりに
rockerjp/tidyverse
のコンテナ内で R を起動して、プロットすることに成功しました。これで自分で tidyverse
パッケージ群をインストールせずに済みます。
公式イメージで libxt6
パッケージを追加してもらえれたら今回のような手間は減るのですが……(他力本願)