Posted at

R言語でパッケージのインストールと読み込みを行うスニペット

More than 1 year has passed since last update.

R言語で、「パッケージがインストールされていれば読み込んで、なければインストールする」という書き方スニペット集。

案外「これだ!」という書き方が今までできていなかったので。


追記

@hoxo_m さんの同様の記事もありましたが、一応複数指定対応版ということで公開します。



完成版

パッケージを複数指定して、読み込みorインストールを行う。

libs <- c("magrittr","RSQLite")

requireLibs(libs)

requireLibs <- function(libs) {
for(lib in libs){
if(!require(lib, character.only = T)){
install.packages(lib)
require(lib, character.only = T)
}
}
}


ハマりどころ


libraryとrequire

library()とrequire()共にパッケージの読み込みを行いますが、requireは読み込み対象がなかった場合にfalseを返すのでインストールが必要かどうかの判定に使えます。

なお、libraryも引数にlogical.return = Tを指定すると同様の動きになります。


パッケージ名の指定

lib <- "RSQLite"

require(lib)
library(lib)

とすると、両方とも"lib"という名前のパッケージを探してしまうため、エラーになってしまいます。

引数に"character.only = T"を追加することで変数を展開して参照してくれます。


おまけ


evalで解釈させる

character.onlyを使わなくても、変数と解釈して展開してくれれば良いので、文字列を作ってevalで読み込ませるという力技もできます。

requireLibs_eval <- function(libs) {

for(lib in libs){
req.parse <- parse(text = paste0("require(", lib, ")"))
if(!eval(req.parse)){
install.packages(lib)
eval(req.parse)
}
}
}

ええ、はい、character.onlyがあることに気づくまではこうしてましたですとも。


installされているかのチェックを先に行う

また、こちらの記事の@uriさんのコメントにあるような

現在インストールされているパッケージ一覧を取得して、ないもののみインストールするというやり方もいいですね。