[R] Rでパッケージを必要に応じてインストールする

はじめに

RをRStudio等の開発環境でいじっていて、パッケージのインストール、ライブラリのロードは通常以下の様に記述することと思いますが。

install.package("somepackagename")
library(somepackagename)

ローカルで開発しているときには、パッケージのインストール処理を一回行えば、Rインタプリタ上で .libPaths() と入力して出力される場所にパッケージがインストールされます。1

パッケージはいったんインストールされてしまえば、バージョンが変わったりしなければ長い時間をかけて再インストールする必要はないです。一人で開発している際にはinstall.package を実行する際にRStudioのアラート等でインストール済みである旨を表すGUIが出るので、その時にインストールしないようにすれば再インストールの時間は省けます。

ですが、多人数の環境で動かす前提のRスクリプトでは話が変わってきます。RScript コマンドでスクリプトをワンライナーで実行する際には、パッケージがインストールされていない環境のことも考慮する必要があり、「指定パッケージがインストールされていなかったらインストールする」というコードを組む必要があります。

今回はその方法をさらっと紹介します。

コードサンプル

四行のみのコードでいけます

targetPackages <- c('openxlsx', 'PerformanceAnalytics') 
newPackages <- targetPackages[!(targetPackages %in% installed.packages()[,"Package"])]
if(length(newPackages)) install.packages(newPackages, repos = "http://cran.us.r-project.org")
for(package in targetPackages) library(package, character.only = T)
  • l1 : インストールしたいパッケージ名一覧をベクトル形式で宣言します
  • l2 : installed.packages() 関数でインストールされているパッケージの一覧が取得できるため、インストールしたいパッケージの中でそのなかにないもの newPackages を抽出します。コマンドで実行した時にはミラーの設定を求められるため、ミラーの参照先としてCRANのサイトを引数に指定します。
  • l3 : newPackages の中身がひとつでもあったら install.packages() 関数でパッケージのインストールを一括で実施します。
  • l4 : インストールしたいパッケージ一覧をfor-in文でまわして library 関数で文字列としてライブラリをロード(character.only = T)するようにします。

おわりに

分析や集計を行う自前のスクリプトも引き継ぎが前提となると、チーム内の開発環境の前提を考えなくてはならなくなったり、運用しやすいコードを心がけていく必要に迫られます。

今回はその一つとしての開発環境の前提に依存しないパッケージのロードのためのコードの紹介でした。

参考


  1. パッケージのインストール場所を変更するときは .RProfile にパスを明示的に指定します。.RProfileまわりの公式なドキュメントは Initialization at Start of an R Session にあります。