夕蛙のなく頃に

データアナリストとして学んだことや趣味で勉強し始めたIoTをアウトプットする

R・RStan環境をDockerで構築する

なにこれ

RStanを勉強するために環境構築したい。どうせならDockerを使ってみる。

使うdockerイメージによって変わるのかもしれないが、RStanのインストールでエラーが出たので、ログを残す

環境

❯ docker --version
Docker version 18.09.2, build 6247962

❯ docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
tokyor/rstudio                 latest              c53aa47cd11b        16 months ago       1.89GB

DockerでR環境を構築する

下記コマンドを実行し、tokyor/rstudioイメージを元にして、環境を構築しました。
http://localhost:8787 にアクセスするとRStudioが開くと思います。

$ docker run -it -d --name rstudio -p 8787:8787 tokyor/rstudio

そして、RStudioのコンソールでrstanをインストールしようとしたのですが、 エラーでインストールできませんでした。。。

> install.packages('rstan', dependencies = TRUE)

(略)

g++  -I/usr/local/lib/R/include -DNDEBUG -I"../inst/include" -I"`"/usr/local/lib/R/bin/Rscript" --vanilla -e "cat(system.file('include', 'src', package = 'StanHeaders'))"`" -DBOOST_DISABLE_ASSERTS -DBOOST_PHOENIX_NO_VARIADIC_EXPRESSION -I"/usr/local/lib/R/site-library/Rcpp/include" -I"/usr/local/lib/R/site-library/RcppEigen/include" -I"/usr/local/lib/R/site-library/BH/include" -I"/usr/local/lib/R/site-library/StanHeaders/include" -I/usr/local/include   -fpic  -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c lang__grammars__statement_grammar_inst.cpp -o lang__grammars__statement_grammar_inst.o
/usr/local/lib/R/etc/Makeconf:168: ターゲット 'lang__grammars__statement_grammar_inst.o' のレシピで失敗しました
Warning in install.packages :
  installation of package ‘rstan’ had non-zero exit status
Warning in install.packages :
  installation of package ‘shinystan’ had non-zero exit status

エラーの原因と解決策

コンパイルの設定にあるようで、以下のチュートリアルにある Configuration of the C++ Toolchain のコマンドによって、コンパイル時の設定ファイルを追加で作ってあげると解決しました。 RStan Getting Started · stan-dev/rstan Wiki · GitHub

# RStudioにて
dotR <- file.path(Sys.getenv("HOME"), ".R")
if (!file.exists(dotR)) dir.create(dotR)
M <- file.path(dotR, ifelse(.Platform$OS.type == "windows", "Makevars.win", "Makevars"))
if (!file.exists(M)) file.create(M)
cat("\nCXX14FLAGS=-O3 -march=native -mtune=native",
    if( grepl("^darwin", R.version$os)) "CXX14FLAGS += -arch x86_64 -ftemplate-depth-256" else 
    if (.Platform$OS.type == "windows") "CXX11FLAGS=-O3 -march=native -mtune=native" else
    "CXX14FLAGS += -fPIC",
    file = M, sep = "\n", append = TRUE)

解決策を恒常的に反映させたい

新しくコンテナを立ち上げるたびに変更を加えてRStanをインストールするのは面倒なので、Dockerfileを作成します。

$ cat setting.R
dotR <- file.path(Sys.getenv("HOME"), ".R")
if (!file.exists(dotR)) dir.create(dotR)
M <- file.path(dotR, ifelse(.Platform$OS.type == "windows", "Makevars.win", "Makevars"))
if (!file.exists(M)) file.create(M)
cat("\nCXX14FLAGS=-O3 -march=native -mtune=native",
    if( grepl("^darwin", R.version$os)) "CXX14FLAGS += -arch x86_64 -ftemplate-depth-256" else
    if (.Platform$OS.type == "windows") "CXX11FLAGS=-O3 -march=native -mtune=native" else
    "CXX14FLAGS += -fPIC",
    file = M, sep = "\n", append = TRUE)
install.packages('rstan')
$ cat Dockerfile
FROM tokyor/rstudio

WORKDIR /home/rstudio
COPY setting.R .

# R Compile setting
RUN Rscript setting.R
$ docker build -t ${DOCKER_IMAGE_NAME} .

参考URL

rstan fails to install under Centos 7 · Issue #589 · stan-dev/rstan · GitHub

Docker — docker コンテナの中で vim が使えない場合 - Qiita