【R パッケージ】インストールも読み込みも一撃で?【pacman】

R

install.packages() はもう不要!

公開

2024年5月7日

最終更新

2024年6月27日

はじめに

何か新しいプロジェクトを始める際に、新しいパッケージをいちいちインストールして読み込むのは面倒ですよね。

そんな時に便利な pacman パッケージのご紹介です。

pacman とは

ざっくり言うと、パッケージのマネジメントツールです。このパッケージには p_ で始まる様々な関数が含まれています。

特に便利なのが p_load() で、パッケージのインストールと読み込みを両方してくれます。もちろんインストール済みのパッケージは、読み込むだけです。

さらに便利なのは、複数のパッケージをまとめて書けるということです。install.packages() は一度に複数のパッケージをインストールできるものの、library() はパッケージごとにしなくてはなりません。その点 pacman::p_load() は、括弧内にパッケージを並べて書くことで、複数のパッケージを一度にインストール、読み込みまでしてくれます(しかもダブルクォーテーションで囲まなくてよい!)。

使ってみる

早速使ってみます。今回は、tidyverse, sf, here の3つを使いたいとして、まだインストールもしていないとします。

library()

まず、インストールします。

install.packages("tidyverse")
install.packages("sf")
install.packages("here")

次に、読み込みます。

library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.1
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(sf)
Linking to GEOS 3.10.2, GDAL 3.4.1, PROJ 8.2.1; sf_use_s2() is TRUE
library(here)
here() starts at /home/rstudio/work

これで使えるようになりました。

p_load()

pacman::p_load() はこれで一発です。

pacman::p_load(tidyverse, sf, here)

この場合、上に出てきたような読み込みに付随するメッセージは出てきません。

使うにあたって

pacman がパッケージである以上、はじめに install.packages("pacman") はしなければなりません。それ以降は install.packages() とはおさらばできます。

packman:: の書き方を使って、library(pacman)も省略しましょう1

また、Docker を用いて環境構築する場合、Dockerfile にインストールすることを指示しておけば、それすら要らなくなります2

Dockerfile に以下を追加します。

Dockerfile
RUN R -e "install.packages('pacman')"

これでビルドすれば、RStudio でインストールせずとも pacman が使えます。

おまけ

パッケージを全部アップデートしたい、なんてこともありますよね。RStudio から一括でやる方法もありますが、せっかくなので pacman を使ってやってみましょう。

pacman::p_update()

これでいけます。

まとめ

pacman パッケージをご紹介しました。

library() とどちらを使うかはお好み次第だと思います。

魅力を感じた方はぜひ使ってみてください!

参考

  1. この書き方では、library() を使わずともパッケージ内の関数が使えます。一度だけ使いたい!というときに便利です。また、どのパッケージに属しているかが明確になるというメリットもあります。↩︎

  2. こちらを参照↩︎