戯言日記

Rの話だと思ったら唐突にサバゲーが混じってくる何か。

Rのバージョンアップでゴリ押ししようとしたけどpacmanパッケージでいいじゃんとなった

概要

以前にこんな記事を書いた。

doubtpad.hatenablog.com

最新版の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アドカレにこんな記事を見つけた。

blog.atusy.net

例えば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!!



  1. たぶんR 4.2でUTF-8が標準になる仕様変更の煽りだと思うので、正式版の早期登場が待たれる。