サマリ
- RStudio Package Manager ( https://packagemanager.rstudio.com ) を使うと、Linux (Ubuntu, CentOS/RHEL, openSUSE/SLES) 上の R (3.4 or later) にコンパイル済のバイナリパッケージをインストールすることができる
- 過去のバージョンのパッケージを導入することもでき、再現性の確保に役立つ(2017-10-10が一番古い模様)
- RStudio上では、
options(repos = "...")
に生成されたURLを設定するだけで使用可能だった - RStudio以外で使用するためには、HTTP User-Agent を設定する必要がある
RStudio Package Manager ?
Rで解析を行う際に、Dockerなどを使って手元のPCにRStudio Serverを立てる方法は一見面倒ですが
- Windowsの文字コード問題の回避:
Shift-JIS(システム、パス)とUTF-8(スクリプト、Rmarkdown)の混在によるトラブルを回避できる - 再現性の確保:
R本体やパッケージのバージョンを固定、共有することができる
といったメリットが個人の作業であっても得られます。
その際のベースとして便利な rocker project による rocker/tidyverse
などの構築済みイメージでは、これまで MRAN (Microsoft R Application Network) のスナップショットをインストール元とすることでR本体やパッケージのバージョンが固定されていました。しかし、最近 rocker-org/rocker-versioned2 (Github) で開発されているR 4.0以降の新しいイメージでは、MRANは使用されておらず代わりに "RStudio Package Manager" というものが使われているようです。
'Public' RStudio Package Manager ?!
https://rstudio.com/products/package-manager/ を見る限りではエンタープライズ向けのようで、諦めて自分用に使い慣れたMRANを使ったDocker imageを作ることを検討していた矢先に、Twitterのタイムラインで次のようなtweetを見ました。
Really excited that https://t.co/VV8S7GkE9H is now publicly available — among other things it provides Linux binaries for CRAN packages, which makes install so so much faster. Learn more at https://t.co/zId043OT7x #rstats
— Hadley Wickham (@hadleywickham) July 3, 2020
告知のBlog post によると、コミュニティ向けに
- Access to pre-compiled packages on Linux via install.packages resulting in significantly faster package install times on Linux systems including cloud servers, CI/CD systems, and Docker containers.
- Historical checkpoints for CRAN enabling reproducible work, and even time travel, by freezing package dependencies with a one-line repository option.
- Expanded Windows support for older versions of R, allowing you to access the latest versions of packages on older versions of R without compiling from source.
が提供されるとのことです。特定時点のしかもLinux向けコンパイル済パッケージが利用できるということで、コンパイルが必要なMRAN snapshotからの乗り換えを検討することにしました。
Step 0. 検証環境
筆者の環境ではまだWSL2を導入できていないため、今回は Windows 10 Home (1909) にインストールした Docker Toolbox で検証しました。
RStudio Package Managerが対応しているLinuxディストリビューションは現時点で
- Ubuntu 16.04 (Xenial)
- Ubuntu 18.04 (Bionic)
- Ubuntu 20.04 (Focal)
- CentOS/RHEL 7
- CentOS/RHEL 8
- openSUSE 42/SLES 12
- openSUSE 15/SLES 15
とのことで、Debian 10 (buster) がベースの rocker/tidyverse:3.6.3
などでは使えないようです。
今回は ubuntu:18.04
の公式イメージをベースに R 4.0.2 と RStudio server 1.3.959 をインストールしたイメージを準備しました。
Step 1. RStudio上での利用
https://packagemanager.rstudio.com/ の [Get Started] からweb clientに入り、[Setup] ページで
- "CLIENT OS" を "Ubuntu 18.04 (Bionic)"
- "Repository URL" の下で "Freeze to June 29, 2020" (latestからFreezeに変えたあとで日付を選択)
- You can also choose to use source or binary packages. は "Binary"
とすると、https://packagemanager.rstudio.com/all/__linux__/bionic/297
というURLが表示されます。これを options(repos = "...")
で指定すれば良いようです。
(今回は、[Setup] ページにある RStudio の Tools - General Option - Packages に入力する方法はうまく行かなかったので、~/.Rprofile
で設定しました)
> install.packages("pROC")
Installing package into ‘/usr/local/lib/R/site-library’
(as ‘lib’ is unspecified)
URL 'https://packagemanager.rstudio.com/all/__linux__/bionic/297/src/contrib/pROC_1.16.2.tar.gz' を試しています
Content type 'binary/octet-stream' length 1340623 bytes (1.3 MB)
==================================================
downloaded 1.3 MB
* installing *binary* package ‘pROC’ ...
* DONE (pROC)
The downloaded source packages are in
‘/tmp/Rtmp1q0B5U/downloaded_packages’
きちんと installing *binary* package ... と表示されコンパイルもなしでインストールが完了しました。
([Setup] ページ中盤の Install System Prerequisites for the Repo’s Packages を参考に、必要なライブラリなどを予めインストールしておきます)
Step 2. RStudio外での利用
今回の最終目標は、Docker imageをビルドする際にコンパイル済パッケージを利用することです。
Step 1 で ~/.Rprofile
にRStudio Package Managerのレポジトリ情報を記載しているので、Rscript -e "install.packages(...)"
でもインストールができることを期待してRStudioを抜けてシェルから確認したところ、
$ Rscript -e "install.packages('pROC')"
パッケージを ‘/usr/local/lib/R/site-library’ 中にインストールします
(‘lib’ が指定されていないため)
URL 'https://packagemanager.rstudio.com/all/__linux__/bionic/297/src/contrib/pROC_1.16.2.tar.gz' を試しています
Content type 'binary/octet-stream' length 371082 bytes (362 KB)
==================================================
downloaded 362 KB
* installing *source* package ‘pROC’ ...
** パッケージ ‘pROC’ の解凍および MD5 サムの検証に成功しました
** using staged installation
** libs
g++ -std=gnu++11 -I"/usr/share/R/include" -DNDEBUG -I'/usr/local/lib/R/site-library/Rcpp/include'
-fpic -g -O2 -fdebug-prefix-map=/build/r-base-aGvNeb/r-base-4.0.0=. -fstack-protector-strong
-Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c RcppExports.cpp -o RcppExports.o
(以下略)
今度は installing *source* package ... と表示されコンパイルが始まってしまいました。
2-2. HTTPUserAgent の設定
改めて FAQ for Public RStudio Package Manager を読むと、
Note that your R environment may require additional configuration steps to use binary packages from RStudio Package Manager, particularly on Linux.
と注意が書かれていました。ドキュメントをたどっていくと、
Configuring the R User Agent Header
Package Manager serves the appropriate binary package based on the R version and OS in the user's
User-Agent
request header.
R users or RStudio Server admins may need to additionally configure the user agent in R if using:
- R 3.6 or later
- A non-default download method such as "curl" or "wget"
https://docs.rstudio.com/rspm/admin/serving-binaries/#binaries-r-configuration-linux
とのことで、User-Agent
リクエストヘッダを修正する必要があるようです。修正内容は同じページに記載されており、
# Set the default HTTP user agent
options(HTTPUserAgent = sprintf("R/%s R (%s)", getRversion(), paste(getRversion(), R.version$platform, R.version$arch, R.version$os)))
これを指示通り ~/.Rprofile
に追加したところ、RStudio外でもバイナリパッケージがインストールできるようになりました。littler
の install2.r
などの便利スクリプトも利用可能です。
options("HTTPUserAgent")
の内容
環境 | User-Agent 文字列 |
---|---|
変更前の素の R 4.0.2 | R (4.0.2 x86_64-pc-linux-gnu x86_64 linux-gnu) |
変更前の R 4.0.2 on RStudio 1.3 | RStudio Server (1.3.959); R (4.0.2 x86_64-pc-linux-gnu x86_64 linux-gnu) |
変更後 (共通) | R/4.0.2 R (4.0.2 x86_64-pc-linux-gnu x86_64 linux-gnu)" |
問題なく設定できているかは、診断スクリプトが提供されています。
source("https://docs.rstudio.com/rspm/admin/check-user-agent.R")
上記を実行して Success! Your user agent is correctly configured. と表示されれば完了です。
使用感
同じような内容のDockerfileからのイメージ作成が早くなった(必要パッケージ等のダウンロード時間が多いのでネットワーク状況にも左右されますが)ことに加え、これまでは Docker Toolbox の初期設定(1 core, メモリ 1GiB)ではメモリ不足でコンパイルが止まってしまっていた Prophet
などの大きなパッケージも簡単にインストールできるようになりました。
※ コミュニティ向けの "Public" Package Manager ということですが、ライセンスの記載などを見つけられませんでした。
※ 自分で試してみたことの備忘録的な内容ですが、誤りなどありましたらご指摘下さい。