※install.packages()
は普通に変数参照で実行できることが判明したため記載見直しました。申し訳ありません。(2024.05.03)
TL;DR
, install.packages()
library()
の引数に変数を渡したい場合、character.only=TRUE
オプションが必要
経緯
- インストール済のパッケージに対して
install.packages()
したときに例外吐くのがなんか嫌なので、インストール済のパッケージはインストールを飛ばすようにしたい - パッケージ名のベクトルを作って、
install.packages()
に変数でパッケージ名を渡してやればいいはず - ついでに
library()
で読み込む関数もベクトルで管理できるとイケてるよね - 以下で実装
hoge.R
# インストールしたいパッケージのベクトルを作る
required_packages <- c("dplyr", "jsonlite")
installed_packages <- rownames(installed.packages())
missing_packages <- required_packages[!(required_packages %in% installed_packages)]
# インストール
sapply(missing_packages, function(p){
install.packages(p)
})
sapply(required_packages, function(p){
library(p)
})
問題
以下の例外が発生。
変数の中身じゃなくて変数名が解釈されてる!?!?!?
Console
> library(p)
library(p) でエラー: ‘p’ という名前のパッケージはありません
対策
library
関数にcharacter.only=TRUE
オプションが必要
hoge.R
library(p, character.only = TRUE)
原因
こういう仕様です、としか言いようがない…
実装も読みつつ諸々調べたが、渡された引数p
はデフォルトだと解析はされるが式として評価されない実装になっている模様。
この実装だと何が嬉しいのかは全く理解できてない。今後の課題ですね。。。
余談
install.packages()
関数のお話。
これ書くためにドキュメント読んでて初めて知ったこと。
install.packages()
に限り、引数にはベクトルを渡せるらしい。
つまりapply
なんか嚙ませなくても以下の一発でいける。マジかよ。。。
hoge.R
install.packages(missing_packages)
感想
Rのこういう他言語の常識を平気で裏切ってくるところ結構好きだったりはします。