Rのバージョンアップでゴリ押ししようとしたけどpacmanパッケージでいいじゃんとなった
概要
以前にこんな記事を書いた。
最新版のRStudioでいくつかの関数が文字化けする問題で、R 4.2にすれば治るのか確認したくて開発者版を入れたため、この記事の時と同じようにセットした。
install.packages(dir(file.path("C:/....../R/R-4.1.2/library")))
そしてRStudioがクラッシュした。
なんかここ最近、普通に解析してる場面でのクラッシュやら急な文字化けやら、Windows版に関してはかなり動作が怪しい気がするの自分だけだろうか……1。
一括で進めていた途中でクラッシュしたので再度ダウンロードからやり直さないといけないのだが、以前のコードのままだとインストールできたものも改めて再インストールしてしまうため、ちょっと手直しした。
と言っても、for文で回して「パッケージがあるか確認→必要ならインストール」といった手順を踏むことで、エラーが起きても途中までは確実に進むようにしただけ。
for(i in dir(file.path("C:/Program Files/R/R-4.1.2/library"))){ if(!requireNamespace(i, quietly = T)){ try(install.packages(i)) } else{ print(i) #確認のためにコンソールへ出力 } }
注意点として、パッケージがインストールされているかの判断でよく見かけるrequire()を使うと、インストールしてあるパッケージを全て読み込んでしまう。
そのため今回はrequreNamespaceで判定する形にしている。
pacmanパッケージの活用
などとごちゃごちゃコードを書いていたのだが、もっと綺麗な書き方はないかと色々見ていたら2018年のRアドカレにこんな記事を見つけた。
例えばpacman::p_load()はパッケージの有無の確認からインストール、その後のロードまで一括でやってくれるらしい。しかもパッケージ名は纏めて渡せる。何これ超便利。
pacman::p_load(tidyverse, magrittr, lubridate, data.table)
「……ということは、パッケージのロードはせずにインストールだけ実施できる関数もあるのでは?」と思って調べたらやはりあった。
for(i in dir(file.path("C:/Program Files/R/R-4.1.2/library"))) pacman::p_install(i, character.only = T, force = F, type = "source")
正確には、p_install()でforce = F
を指定すると未インストールのパッケージのみ対象にとってインストールができる。
もうこれでいいじゃん。
p_install()はp_load()と違ってパッケージ名を纏めて渡すことができないのでfor文で回す必要はあるものの、先ほども言及した「途中でクラッシュした場合に面倒」という問題が回避できるため特に気にならない。
その際はcharacter.only = T
を入れることで変数に代入した文字列を読めるようになる(入れないと「i」という名前のパッケージを探そうとする)。
また、install.packages()のオプションも併用できるので、type = "source"
などを指定しておくと一々操作する手間が省ける。
以前までなんかごちゃごちゃ書いていた分、簡潔に実現できることへの感動がすごい。
なお、環境を丸ごと引っ越さなくていいって人はRMarkdownなどでのライブラリ読込を全てp_load()に切り替えておけば、環境移行時にpacmanだけインストールするとあとは勝手に全部やってくれるのでストレスフリーになる。
もうこれでいいじゃん(2回目)。
結論
pacmanを使おう。
Enjoy!!