読者です 読者をやめる 読者になる 読者になる

jnobuyukiのブログ

JavaScriptとR言語を中心に研究活動に役立つwebアプリケーション技術について考えていきます。twitter ID: @j_nobuyuki

Dockerを利用してRStudioのRマークダウンファイルを使う

今回は、かなり技術的な内容です。Dockerを利用しながら、RStudioのRマークダウンファイルによる解析環境を構築します。ポイントは、日本語フォントが入っていてもきちんとPDF出力がなされるところです。

Dockerって?

Docker社が提供しているサービスです。 PC内に仮想のコンテナをつくって、コンテナ内でいろいろな情報処理を行います。いわゆる仮想PCと違うのは、必要なサービスだけを高速かつ少ない容量で仮想化しているところです。Docker自体の説明は、詳しいページがいくらでも検索できるのでそちらをごらんください。

bufferings.hatenablog.com

使用環境

今回はMac OSXに Docker Toolboxをインストールした環境で実施しています。 Docker Toolboxは更新が頻繁にあるようで、しかも更新によって動かなかった機能が動くようになっているので、できるだけ最新を使ったほうが良さそうです。

  • Mac OSX 10.10.5(Yosemite)
  • Docker Toolbox 1.10.1a

Dockerfileで環境構築

Dockerfileやベースとなるイメージもすでにきちんと動いているものを利用します。この点もDockerのメリットの1つですね。
RStudioが動くイメージの一つにrocker/rstudioがあります。このイメージでは、ベースのRとRstudioがdebianというLinux OSの中で動きます。

https://hub.docker.com/r/rocker/rstudio/

さらにrocker/rstudioから派生したrocker/hadleyverseというイメージファイルがあります。このイメージのDockerfileを今回利用します。

github.com


このDockerfileをdocker-machineの中でビルドすれば、当然ちゃんと動きます。しかし、実際にやってみたところ、日本語フォントがうまく読めないようです。そこでDockerfileを修正しながら、日本語フォントでもきちんと動作することを目指します。

Hadleyverseというイメージとの差分

  • manというパッケージのインストールを省略(エラーがでたため)
  • texlive-xetex, texlive-luatexをインストール(後でRマークダウンファイルをPDFに変換するのに使います)
  • texlive-font-extraをインストール(rocker/hadleyverseの作成者はファイルが思いので嫌がっていますが、日本語フォントの表示には必要そうです)
  • multcompというRのパッケージのインスールを省略(エラーがでたため)
  • IPAフォントのインストール(Debianの中で使用可能な日本語フォントが不明だったので、ダウンロードして使います)
  • 言語環境を英語から日本語に変更

出来上がったDockerfile

Dockerfileは"Dockerfile"という名前で保存する必要がありそうです。

FROM rocker/rstudio

MAINTAINER "jnobuyuki" 


RUN apt-get update 
RUN apt-get install -y --no-install-recommends \
    ibus-mozc \
    manpages-ja 

RUN apt-get install -y --no-install-recommends imagemagick \
	lmodern \
	texlive \
	texlive-lang-cjk \
    texlive-luatex \
    texlive-xetex \
	xdvik-ja \
	dvipsk-ja \
	gv \
	texlive-fonts-recommended \
	texlive-fonts-extra \
	&& apt-get clean \
	&& cd /usr/share/texlive/texmf-dist \
	&& wget http://download.forest.impress.co.jp/pub/library/i/ipafont/10483/IPAfont00303.zip \
	&& unzip IPAfont00303.zip \
	&& echo "Map zi4.map" >> /usr/share/texlive/texmf-dist/web2c/updmap.cfg \
  	&& mktexlsr \
  	&& updmap-sys




## Install some external dependencies. 
RUN apt-get update \
  && apt-get install -y --no-install-recommends -t unstable \
    default-jdk \
    default-jre \
    gdal-bin \
    icedtea-netx \
    libatlas-base-dev \
    libcairo2-dev \
    libgsl0-dev \
    libgdal-dev \
    libgeos-dev \
    libgeos-c1v5 \
    librdf0-dev \
    libssl-dev \
    libmysqlclient-dev \
    libpq-dev \
    libsqlite3-dev \
    libv8-dev \
    libxcb1-dev \
    libxdmcp-dev \
    libxml2-dev \
    libxslt1-dev \
    libxt-dev \
    netcdf-bin \
    qpdf \
    r-cran-rgl \
    ssh \
  && R CMD javareconf \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/ \
  && rm -rf /tmp/downloaded_packages/ /tmp/*.rds

## Install the Hadleyverse packages (and some close friends). 
RUN install2.r --error \
    broom \
    DiagrammeR \
    devtools \
    dplyr \
    ggplot2 \
    ggthemes \
    haven \
    httr \
    knitr \
    lubridate \
    packrat \
    pryr \
    purrr \
    reshape2 \
    rmarkdown \
    rmdformats \
    rticles \
    rvest \
    readr \
    readxl \
    testthat \
    tibble \
    tidyr \
    tufte \
    shiny \
    stringr \
    xml2 

## Manually install (useful packages from) the SUGGESTS list of the above packages.
## (because --deps TRUE can fail when packages are added/removed from CRAN)
RUN install2.r --error \
    -r "https://cran.rstudio.com" \
    -r "http://www.bioconductor.org/packages/release/bioc" \
    base64enc \
    BiocInstaller \
    codetools \
    covr \
    data.table \
    downloader \
    gridExtra \
    gtable \
    hexbin \
    Hmisc \
    htmlwidgets \
    jpeg \
    Lahman \
    lattice \
    lintr \
    MASS \
    PKI \
    png \
    microbenchmark \
    mgcv \
    mapproj \
    maps \
    maptools \
    mgcv \
    nlme \
    nycflights13 \
    quantreg \
    Rcpp \
    rJava \
    roxygen2 \
    RMySQL \
    RPostgreSQL \
    RSQLite \
    testit \
    V8 \
    XML \
  && r -e 'source("https://raw.githubusercontent.com/MangoTheCat/remotes/master/install-github.R")$value("mangothecat/remotes")' \
  && r -e 'remotes::install_github("wesm/feather/R")' \
  && rm -rf /tmp/downloaded_packages/ /tmp/*.rds

RUN echo "ja_JP.UTF-8 UTF-8" >> /etc/locale.gen
RUN locale-gen
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8

Dockerでの手順

1. Docker-machineを起動する
2. cd で Dockerfileがあるディレクトリに移動する
3. 以下のようにDockerfileからイメージをビルドする

docker build -t <レポジトリ名/イメージ名> .

4. 以下のようにイメージを起動する。-p オプションはホスト側とコンテナ側のポート番号のマッピングです。両方8787でオッケーです。

docker run -d -p 8787:8787 <レポジトリ名/イメージ名>

5. webブラウザを起動し、Docker-machineのIP:8787 でRstudioのログインが出てきます。デフォルトはID,PASSともにrstudioです。

以上でRSutdioが起動すると思います。

RStudioでの手順

1. New FileでRmarkdown形式のファイルを作る
2. Global optionのSweave項目でviewerをデフォルトのRstudio viewerからSystem Viewerに変更する *1
3. preamble(ヘッダのような部分)を以下のようにします。タブスペースの個数がポイントです。

---
title: "Document Title"
author: "autho"
date: "****/**/**"
output:
  pdf_document:
    latex_engine: xelatex
monofont: IPAPGothic
mainfont: IPAPGothic
---

このDockerイメージはIPAフォントをダウンロード・インストールしているので、これを使います。latex_engineはlualatexかxelatexが使えます。
5. knit PDFのボタンを押すか、ショートカット(Command + Shit + k)を実行します。

考察:Dockerを使うメリットとデメリット

手順は以上ですが、 Dockerを利用して解析することのメリットとデメリットを考えておきましょう。

メリット
  • 突然母艦 PCが亡くなっても、1時間あれば解析環境が完全復活する。
  • 共同研究者に同一解析環境を丸ごと渡せる。
  • 授業で学生に開発環境をデータ込みで配布できる。
  • 古いバージョンのアプリケーションによる解析環境を安全に保存できる。
デメリット
  • 別に仮想環境がなくてもmacで十分動くものについてわざわざコンテナを組むのは多少面倒
  • 共同研究者にDockerのメリットを理解してもらい、最低限のコマンドを覚えてもらうよう説得しなければならない。
  • ダブルクリックと比較するとCUIで RStudioを実行するのは面倒

今のところ、多少の学習コストとタイピングを我慢すれば、大きなメリットを得らえる気がします。macはどんなに良い製品であっても、使い続ければ必ずダメになる日が来るので、その時の手間を大幅に節約できるだけでも便利な気がします。

*1:RStudio viewerは日本語フォントが文字化けする気がします