R

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

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さんのコメントにあるような
現在インストールされているパッケージ一覧を取得して、ないもののみインストールするというやり方もいいですね。