ほくそ笑む

R言語と統計解析について

R言語こぼれ話(1) パッケージとライブラリの違い

R言語を使っていると、「パッケージ」や「ライブラリ」という言葉をよく目にすると思います。 多くの人は、パッケージとライブラリを同じものだと思っているのではないでしょうか。 Rを普通に使う上では、これらを同じものだと思っていてもほとんど支障はありません。 しかし、R言語において、パッケージとライブラリという用語には明確な違いがあります。

このシリーズでは、R言語を使う上で知っていても知らなくても特に問題にならないようなこぼれ話をしていく予定です。 今回のこの記事では、R言語における「パッケージ」と「ライブラリ」の違いについて説明したいと思います。

パッケージとは

パッケージは、「特定の機能を実現するための関数群をまとめたもの」を指す用語です。 例えば、ggplot2 パッケージは、「エレガントなグラフを描画する」という機能を実現するための関数群を提供します。 また、dplyr パッケージは、「統一的な方法でデータ操作を行う」という機能を実現するための関数群を提供します。

パッケージを利用するには、まずインストールする必要があります。例えば、

install.packages("ggplot2")

を実行すると、ggplot2 パッケージをインストールすることができます。 インストールしたパッケージを使用するには、パッケージを読み込む必要があります。 例えば、

library(ggplot2)

を実行することで、ggplot2 パッケージが読み込まれ、このパッケージが提供する関数群を使用できるようになります。

パッケージのインストールと読み込みの違いは、電球に例えられることがあります。 この電球の例えによれば、インストールは電球の取り付け作業にあたります。 一方、パッケージの読み込みはスイッチをオンすることにあたります。 照明(パッケージの機能)を使うには、電球を取り付けて(パッケージをインストール)して、スイッチをオンする(パッケージを読み込む)必要があります。

照明に電球が取り付けられていなければ、どんなにスイッチをオンオフしても照明は光りません。 これは、パッケージを利用するには、読み込みの前にインストールする必要があることに対応します。

また、電球は一度取り付ければ、スイッチをオンオフすることで何度でも照明をつけたり消したりできます。 これは、インストールは一回だけ行えばよいのに対して、読み込みは使うたびに毎回行う必要があることに対応します(Rを終了すると自動的にスイッチオフされちゃうんですね)。

なぜインストールは一回だけで済むのかというと、パッケージをインストールするときに、そのパッケージを構成するファイル群を自分の PC にダウンロードするからです。 ダウンロードされたファイル群は、読み込みが可能な状態に展開されて、パッケージごとに作られたディレクトリに格納されます。 パッケージごとに作成された個々のディレクトリは「インストール済みパッケージ」と呼ばれます。

この、インストール済みパッケージが格納される場所のことを、R言語では「ライブラリ」と呼びます。

ライブラリとは

Rの公式マニュアルの1つである Writing R Extensions には、はっきりとこう書かれています。

A package is not a library.
訳: パッケージはライブラリではない

それでは、ライブラリとは何なのでしょうか? 続きを読んでみます。

A directory into which packages are installed, e.g. /usr/lib/R/library
(ライブラリとは)パッケージがインストールされるディレクトリのことである(例:/usr/lib/R/library

in that sense it is sometimes referred to as a library directory or library tree
この意味では、「ライブラリディレクトリ」や「ライブラリツリー」とも呼ばれる

パッケージがインストールされるディレクトリ、つまり、「インストール済みパッケージ」が格納されるディレクトリのことを「ライブラリ」と呼ぶのです。 Rの公式マニュアルを読むことで、パッケージとライブラリが全く別のものであるということがわかりました。

R言語の内部でも、パッケージとライブラリという用語は異なる概念として使い分けされています。 例えば、install.packages() は「パッケージ」をインストールする関数であり、lib という引数に「ライブラリ」を指定できます。

install.packages("ggplot2", lib = "C:\\mylib\\")

これは、好きなディレクトリにパッケージをインストールできる、つまり、好きなディレクトリをライブラリにできることを表しています。

install.packages()lib 引数に何も指定しない場合、パッケージはデフォルトのライブラリにインストールされます。 デフォルトの「ライブラリ」を調べるには .libPaths() を実行します。

.libPaths()
[1] "C:/Users/hoxom/AppData/Local/R/win-library/4.2"
[2] "C:/Program Files/R/R-4.2.1/library"   

私の環境では2つのライブラリが出力されました。 1つめは「ユーザーライブラリ」といって、PCの自分のアカウントのみが使えるパッケージが格納されるライブラリです。インストールされたパッケージは基本的にこちらに格納されます。 2つめは「システムライブラリ」といって、このPCのすべてのアカウントで共通のパッケージが格納されるライブラリです。他のユーザーに影響が出るため、こちらに格納されたパッケージを変更するときは細心の注意を払う必要があります。

パッケージを読み込むために library() を実行すると、.libPaths() の1つめのライブラリからそのパッケージを探して、該当パッケージがあればそれを読み込み、無ければ次のライブラリを探すというルールで読み込むパッケージを探します。

特定のライブラリに含まれる「パッケージ」は .packages() 関数で取得できます。 「ライブラリ」の場所は lib.loc 引数で指定します。

.packages(TRUE, lib.loc = "C:\\mylib\\")
[1] "cli"       "ggplot2"   "lifecycle" "rlang"     "vctrs"

このように、R言語では「パッケージ」と「ライブラリ」は明確に区別されて使われています。

混同の原因

R言語において、「パッケージ」と「ライブラリ」が全く異なる概念であるということがわかりました。 しかし、多くの Rユーザーがこれらを混同して使っています。 それはなぜでしょうか?

その原因はおそらく library() という関数にあります。 library() は「パッケージ」を読み込む関数なのに、「ライブラリ」という名前が付けられているのです。

このことについて、Writing R Extensions の脚注 には次のように書かれています。

although this is a persistent mis-usage. It seems to stem from S,
(パッケージとライブラリの混同は)根強い誤用である。これはS言語に由来すると思われる

whose analogues of R’s packages were officially known as library sections and later as chapters
Rにおける「パッケージ」に類するものは、Sの公式では「ライブラリセクション」として知られ、後に「チャプター」となった

but almost always referred to as libraries.
しかし、ほとんど常に「ライブラリ」と呼ばれていた。

R言語の元となったS言語において、パッケージは「ライブラリ」と呼ばれていました。 そのため、R言語でもパッケージを読み込む関数が library() となり、今の混同を招いていると思われます。

まとめ

R言語において、パッケージとライブラリは全く異なる概念でした。 しかし、多くのRユーザーはこれらを同じものだと思っています。 それでも普通のRユーザーは困ることはないでしょう。 この記事に書いてあることは明日には忘れてしまって構いません。 ただし、デフォルトとは異なるライブラリを使おうとするときには、この記事の知識が少しは役に立つかもしれません。