★データ解析備忘録★

ゆる〜い技術メモ

RStudio Server + tidyverse + RMeCab で日本語もOKなDockerイメージをアップデートしました

はじめに

1年ほど前に作った日本語+Mecab+tidyverseなDockerイメージですが、時代に合わせてアップデートしました。

1年前の記事:

y-mattu.hatenablog.com

今回のDocker イメージ: https://hub.docker.com/r/ymattu/mecab-d/

アップデート内容は

  • R 3.4.4 対応
  • TeX Live を入れていたけど Tiny TeX に変更
  • tidytext パッケージを追加

あたりです。

入っている内容は相変わらず tidyverse パッケージ群、MeCab および RMeCabパッケージ、LaTeX環境(R Markdown PDF出力用) です。また、ggplot2 などでの日本語プロットも文字化けしないようにIPAexフォントを入れています。このフォントはR Markdownで日本語のPDFを出力する時にも必要です。

R 3.4.4 対応

つい先日 R 3.4.4 がリリースされました。それに合わせて本家 rocker/rstudio が3.4.4に更新されていてビルドも問題なさそうだったのでこちらも合わせて 3.4.4 にしました。

本家: https://hub.docker.com/r/rocker/tidyverse/

Tiny TeX に変更

これまでは重たい TeX Live をガツンといれて重たい Docker イメージにしていたのですが、よく考えれば R Markdown で PDF 出力するということを考えた場合、フルな TeX は必要ありません。そこで RStudio 社が考えたのが、「R で動かすのに必要最低限の TeX 環境を作ってしまおう」というものです。こうしてできたのが Tiny TeX です。これが結構すごくて、TeX Live のインストールだと数時間かかるのが Tiny TeX だと 10分くらいで終わります。

インストールとか

これは1年前と同じなので下記を参照してください。 Docker 環境は今は Mac であれば Docker for Mac が無料ですし簡単だと思います。

RStudio Server + tidyverse + RMeCab で日本語もOKなDockerイメージを作りました - ★データ解析備忘録★

日本語関連

ggplot2 での日本語

下記のようにフォントを指定(参考: ggplot2で日本語フォントを指定したい)

フォントは Docker 内に用意されています。

font_A <- "IPAMincho"
font_B <- "IPAGothic"

d <- data.frame(X=rep(1:5, 2), Y=c(1:5, 5:1), A=rep(c('a','b'), each=5))

ggplot(data=d, aes(x=X, y=Y, group=A, color=A)) +
  geom_line(size=2) +
  labs(x="えっくす", y="わい", color="えー", title="たいとる") + 
  theme(text = element_text(family = font_A))

f:id:songcunyouzai:20180320142628p:plain

R Markdown での日本語 PDF 出力

YAML フロントマター(.Rmd の冒頭)に以下のように記述。 フォントは用意されているのでこれだけ。

参考:

TinyTeXを使って10分で(R向けの)LaTeX環境を整える - Qiita

---
title: "あいう"
output:
  pdf_document: 
    latex_engine: xelatex 
documentclass: bxjsarticle
classoption: xelatex,ja=standard
geometry: no
---

今後のアップデートについて

R のバージョンが上がった時はなるべく更新するようにします。

あと、他の形態素解析器(JUMAN++とか)についてはこれに入れるかどうかはちょっと迷ってます。イメージ名が mecab-d だし。。。 とはいえあると便利そうなので他のイメージで作るかも?

Appendix1. インストールされているパッケージ

ip <- tibble::as_data_frame(installed.packages()[,c(1,3:4)])
ip <- ip[is.na(ip$Priority),1:2,drop=FALSE]
print(ip, n = Inf)
#> # A tibble: 171 x 2
#>     Package        Version
#>     <chr>          <chr>
#>   1 acepack        1.4.1
#>   2 assertthat     0.2.0
#>   3 backports      1.1.2
#>   4 base64enc      0.1-3
#>   5 BH             1.66.0-1
#>   6 bindr          0.1.1
#>   7 bindrcpp       0.2
#>   8 BiocInstaller  1.28.0
#>   9 bit            1.1-12
#>  10 bit64          0.9-7
#>  11 bitops         1.0-6
#>  12 blob           1.1.0
#>  13 bookdown       0.7
#>  14 brew           1.0-6
#>  15 broom          0.4.3
#>  16 callr          2.0.2
#>  17 caTools        1.17.1
#>  18 cellranger     1.1.0
#>  19 checkmate      1.8.5
#>  20 cli            1.0.0
#>  21 colorspace     1.3-2
#>  22 commonmark     1.4
#>  23 covr           3.0.1
#>  24 crayon         1.3.4
#>  25 crosstalk      1.0.0
#>  26 curl           3.1
#>  27 data.table     1.10.4-3
#>  28 DBI            0.8
#>  29 dbplyr         1.2.1
#>  30 debugme        1.1.0
#>  31 desc           1.1.1
#>  32 devtools       1.13.5
#>  33 dichromat      2.0-0
#>  34 digest         0.6.15
#>  35 docopt         0.4.5
#>  36 dplyr          0.7.4
#>  37 DT             0.4
#>  38 dtplyr         0.0.2
#>  39 evaluate       0.10.1
#>  40 feather        0.3.1
#>  41 forcats        0.3.0
#>  42 formatR        1.5
#>  43 Formula        1.2-2
#>  44 gdtools        0.1.7
#>  45 ggplot2        2.2.1
#>  46 ggplot2movies  0.0.1
#>  47 git2r          0.21.0
#>  48 githubinstall  0.2.2
#>  49 glue           1.2.0
#>  50 gmailr         0.7.1
#>  51 gridExtra      2.3
#>  52 gtable         0.2.0
#>  53 haven          1.1.1
#>  54 hexbin         1.27.2
#>  55 highr          0.6
#>  56 Hmisc          4.1-1
#>  57 hms            0.4.2
#>  58 htmlTable      1.11.2
#>  59 htmltools      0.3.6
#>  60 htmlwidgets    1.0
#>  61 httpuv         1.3.6.2
#>  62 httr           1.3.1
#>  63 hunspell       2.9
#>  64 igraph         1.2.1
#>  65 ISOcodes       2017.09.27
#>  66 janeaustenr    0.1.5
#>  67 jsonlite       1.5
#>  68 knitr          1.20
#>  69 labeling       0.3
#>  70 Lahman         6.0-0
#>  71 latticeExtra   0.6-28
#>  72 lazyeval       0.2.1
#>  73 lintr          1.0.2
#>  74 littler        0.3.3
#>  75 lubridate      1.7.3
#>  76 magrittr       1.5
#>  77 mapproj        1.2-5
#>  78 maps           3.2.0
#>  79 maptools       0.9-2
#>  80 markdown       0.8
#>  81 MatrixModels   0.4-1
#>  82 memoise        1.1.0
#>  83 microbenchmark 1.4-4
#>  84 mime           0.5
#>  85 miniUI         0.1.1
#>  86 mnormt         1.5-5
#>  87 mockery        0.4.1
#>  88 modelr         0.1.1
#>  89 multcomp       1.4-8
#>  90 munsell        0.4.3
#>  91 mvtnorm        1.0-7
#>  92 NLP            0.1-11
#>  93 nycflights13   0.2.2
#>  94 openssl        1.0.1
#>  95 packrat        0.4.9-1
#>  96 pillar         1.2.1
#>  97 pingr          1.1.2
#>  98 pkgconfig      2.0.1
#>  99 PKI            0.1-5.1
#> 100 plogr          0.1-1
#> 101 plyr           1.8.4
#> 102 praise         1.0.0
#> 103 processx       2.0.0.1
#> 104 psych          1.7.8
#> 105 purrr          0.2.4
#> 106 quantreg       5.35
#> 107 R6             2.2.2
#> 108 RColorBrewer   1.1-2
#> 109 Rcpp           0.12.16
#> 110 RCurl          1.95-4.10
#> 111 readr          1.1.1
#> 112 readxl         1.0.0
#> 113 rematch        1.0.1
#> 114 remotes        1.1.1
#> 115 reprex         0.1.2
#> 116 reshape2       1.4.3
#> 117 rex            1.1.2
#> 118 RJSONIO        1.3-0
#> 119 rlang          0.2.0
#> 120 rmarkdown      1.9
#> 121 rmdshower      2.1.1
#> 122 RMeCab         0.99999
#> 123 RMySQL         0.10.14
#> 124 roxygen2       6.0.1
#> 125 RPostgreSQL    0.6-2
#> 126 rprojroot      1.3-2
#> 127 rsconnect      0.8.8
#> 128 RSQLite        2.0
#> 129 rstudioapi     0.7
#> 130 rticles        0.4.1
#> 131 rversions      1.0.3
#> 132 rvest          0.3.2
#> 133 sandwich       2.4-0
#> 134 scales         0.5.0
#> 135 selectr        0.3-2
#> 136 servr          0.8
#> 137 shiny          1.0.5
#> 138 slam           0.1-42
#> 139 SnowballC      0.5.1
#> 140 sourcetools    0.1.6
#> 141 sp             1.2-7
#> 142 SparseM        1.77
#> 143 stopwords      0.9.0
#> 144 stringdist     0.9.4.7
#> 145 stringi        1.1.7
#> 146 stringr        1.3.0
#> 147 svglite        1.2.1
#> 148 testit         0.7
#> 149 testthat       2.0.0
#> 150 TH.data        1.0-8
#> 151 tibble         1.4.2
#> 152 tidyr          0.8.0
#> 153 tidyselect     0.2.4
#> 154 tidytext       0.1.7
#> 155 tidyverse      1.2.1
#> 156 tinytex        0.4.2
#> 157 tm             0.7-3
#> 158 tokenizers     0.1.4
#> 159 tufte          0.3
#> 160 utf8           1.1.3
#> 161 viridis        0.5.0
#> 162 viridisLite    0.3.0
#> 163 webshot        0.5.0
#> 164 whisker        0.3-2
#> 165 withr          2.1.2
#> 166 xfun           0.1
#> 167 XML            3.98-1.10
#> 168 xml2           1.2.0
#> 169 xtable         1.8-2
#> 170 yaml           2.1.18
#> 171 zoo            1.8-1

Appendix2. Dockerfile

FROM rocker/tidyverse:latest
MAINTAINER "ymattu"

## Add LaTeX, rticles and bookdown support
## uses dummy texlive, see FAQ 8: https://yihui.name/tinytex/faq/
RUN wget "https://travis-bin.yihui.name/texlive-local.deb" \
  && dpkg -i texlive-local.deb \
  && rm texlive-local.deb \
  && apt-get update \
  && apt-get install -y --no-install-recommends \
    ## for rJava
    default-jdk \
    ## Nice Google fonts
    fonts-roboto \
    ## used by some base R plots
    ghostscript \
    ## used to build rJava and other packages
    libbz2-dev \
    libicu-dev \
    liblzma-dev \
    ## system dependency of hunspell (devtools)
    libhunspell-dev \
    ## system dependency of hadley/pkgdown
    libmagick++-dev \
    ## rdf, for redland / linked data
    librdf0-dev \
    ## for V8-based javascript wrappers
    libv8-dev \
    ## for jq queries
    libjq-dev \
    ## R CMD Check wants qpdf to check pdf sizes, or throws a Warning 
    qpdf \
    ## For building PDF manuals
    texinfo \
    ## for git via ssh key 
    ssh \
   ## just because
    less \
    vim \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/ \
  ## Use tinytex for LaTeX installation
  && wget -qO- \
    "https://github.com/yihui/tinytex/raw/master/tools/install-unx.sh" | \
    sh -s - --admin --no-path \
  && mv ~/.TinyTeX /opt/TinyTeX \
  && /opt/TinyTeX/bin/*/tlmgr path add \
  && tlmgr install metafont mfware inconsolata tex ae parskip listings \
  && tlmgr path add \
  && Rscript -e "source('https://install-github.me/yihui/tinytex'); tinytex::r_texmf()" \
  && chown -R root:staff /opt/TinyTeX \
  && chmod -R g+w /opt/TinyTeX \
  && chmod -R g+wx /opt/TinyTeX/bin \
  ## And some nice R packages for publishing-related stuff
  && install2.r --error --deps TRUE \
    bookdown rticles rmdshower DT


## Mecab
RUN wget -O mecab-0.996.tar.gz "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7cENtOXlicTFaRUE" ;\
    tar -xzf mecab-0.996.tar.gz ;\
    cd mecab-0.996; ./configure --enable-utf8-only; make; make install; ldconfig

## Ipadic
RUN wget -O mecab-ipadic-2.7.0-20070801.tar.gz "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7MWVlSDBCSXZMTXM" ;\
    tar -xzf mecab-ipadic-2.7.0-20070801.tar.gz ;\
    cd mecab-ipadic-2.7.0-20070801; ./configure --with-charset=utf8; make; make install ;\
    echo "dicdir = /usr/local/lib/mecab/dic/ipadic" > /usr/local/etc/mecabrc

## IPAex Fonts
RUN apt-get clean ;\
  cd /opt/TinyTeX/texmf-dist \
  wget http://dl.ipafont.ipa.go.jp/IPAexfont/IPAexfont00301.zip ;\
  unzip IPAexfont00301.zip \
  echo "Map zi4.map" >> /opt/TinyTeX/texmf-dist/web2c/updmap.cfg ;\
  mktexlsr ;\
  updmap-sys

## Clean up
RUN apt remove -y build-essential ;\
    rm -rf rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* ;\
    rm -rf mecab-0.996.tar.gz* ;\
    rm -rf mecab-ipadic-2.7.0-20070801*

## Change environment to Japanese(Character and DateTime)
ENV LANG ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8
RUN sed -i '$d' /etc/locale.gen \
  && echo "ja_JP.UTF-8 UTF-8" >> /etc/locale.gen \
  && locale-gen ja_JP.UTF-8 \
  && /usr/sbin/update-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
RUN /bin/bash -c "source /etc/default/locale"
RUN ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

## Install additional R packages
RUN Rscript -e "install.packages(c('githubinstall','tm','slam', 'tidytext'))"
RUN Rscript -e "install.packages('RMeCab',repos='http://rmecab.jp/R')"

CMD ["/init"]