はじめに
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 パッケージを追加してもらえれたら今回のような手間は減るのですが……(他力本願)