こんにちは! :smile: 最近ブログの書き方をいろいろと模索しています。この記事からはスタイルをかなり変えてみたので、もしかしたら表示がこれまでと違うかもしれません。。 でもこれでかなり効率化できたはず・・・!
さておき!今回はR言語に欠かせないパッケージ読み込み操作を簡単にする、pacman
パッケージについて紹介します!海外のR関連ブログを見ると5人に2人くらい?は使っている気がします。
組み込み関数のlibrary()
よりもスマートにパッケージを読み込むことができるpacman::p_load()
関数をはじめ、R解析では欠かせないパッケージの管理作業を極めて効率化することのできるオススメパッケージです。
pacman
パッケージはシンプルなパッケージローダーとして有名ですが、実はインストールエラーに対処する時にも役に立つ関数があります。この記事の最後の方でパッケージインストールエラーの対処に便利な関数をまとめていますので、頭の片隅に入れておくと良いと思います!
正直これだけ覚えておけば大丈夫です。 以下のように使います。
pacman::p_load(dplyr, tidyr)
通常であれば、library(pacman)
でpacman
パッケージを呼び出してからでなければp_load()
関数は使用できませんが、パッケージ名::関数()という指定の仕方をするとパッケージを呼び出すこと無く関数を使用することができます。
pacmanはコンパクトなパッケージなので、上記例のように呼び出すのがp_load()だけでも全く問題ありません。
この関数の素晴らしいところはいくつかあります。
まず、パッケージを読み込んだときのメッセージが省略されます。普通、library()関数でパッケージを読み込むと、パッケージによっては様々なメッセージが表示されますよね。一番見かける例としてはtidyverseパッケージを読み込んだ時のメッセージでしょうか。
r$> library(tidyverse)
# ── Attaching packages ──────────────────────────────────────────── tidyverse 1.3.1 ──
# ✔ ggplot2 3.3.5 ✔ purrr 0.3.4
# ✔ tibble 3.1.6 ✔ dplyr 1.0.8
# ✔ tidyr 1.2.0 ✔ stringr 1.4.0
# ✔ readr 2.1.2 ✔ forcats 0.5.1
# ── Conflicts ─────────────────────────────────────────────── tidyverse_conflicts() ──
# ✖ dplyr::filter() masks stats::filter()
# ✖ dplyr::lag() masks stats::lag()
# Warning message:
# In system("timedatectl", intern = TRUE) :
# running command 'timedatectl' had status 1
今回の本題ではないですが、tidyverseパッケージの表示文は結構いいこと書いてあります。 まず最初に
Attaching packages
で書かれていることは、tidyverse
パッケージを読み込む操作によって実際に読み込まれた子ライブラリたちのリストです。ggplot2
やdplyr
が自動的に使えるようになるのは書かれている通りです。 次に、Conflicts
に書かれているのは同じ名前の関数が衝突していることを示しています。そして、dplyr
の関数がstats
の関数をマスクして無効化している旨が書かれています。
環境によってはカラフルで素敵ですが、正直このメッセージが毎回出てくると邪魔です。 昔はsuppresspackagestartupmessages()
関数なんかをよく使ったものですが、それはそれで面倒です(こんな長い関数名覚えられないし)。
これがpacman::p_loadだと以下のようになります。
r$> pacman::p_load(tidyverse)
r$>
何もないです。無です。非常にシンプルで良いですよね。
ちなみに、複数パッケージを同時に読み込むこともできます。
pacman::p_load(tidyverse, ComplexHeatmap)
稀ですが、インストールしてあると思いきやされていなかった場合があります。あるいは、自分の書いたRコードを他人に渡して、その人が未インストールだった時。
こういった場合、library()関数ではpackage does not existというエラーで「パッケージが存在しないよ!」と怒られながらストップしてしまいます😓 こうした場合に、p_load()は「無ければインストールする」を実行してくれます。
この機能は組み込み関数であるrequire()を使って似たようなことができますが、かなりややこしいことになります。
if (!require("dplyr")) {install.packages("dplyr")}
pacman自身を上記コードで仕込んでおく人も多く見ます🙄
p_install_version()
これも一年に数回程度しか発生しない事態ですが、稀に最新バージョンにバグが存在していたり、あるいは仕様が変更になってしまったりして、昨日まで使えていたコードが動作しなくなることがあります。
こういった場合はパッケージのダウングレードを行うために、バージョンを指定してインストールする必要があります。このようなケースではp_install_version()が有効です。
pacman::p_install_version(
c("pacman", "testthat"),
c("0.2.0", "0.9.1")
)
p_temp()
Rを使い慣れてくると、色々な便利パッケージを探してはインストールしてみたりします。そして気づけばガラクタパッケージの山・・・なんてことはありがちです。
今後もずっと使うか分からないパッケージはp_temp()
でお試しインストールするのが良いでしょう👍
p_temp()
を使用すると、「インストールはされていないがロードはされている」という状態になり、セッションを閉じると跡形も残りません。
pacman::p_temp(ggbeeswarm)
#..
#(省略)
#The downloaded source packages are in
# ‘/tmp/RtmpSUbJH4/downloaded_packages’
#
#ggbeeswarm installed
この方法を使うと/tmpにインストールされるようですね。
p_update()
tidyverse関係のパッケージでもあることですが、一年に一度くらいの頻度で中規模アップデートが入ることがあります。アップデートはRstudioの設定画面からも行うことができますが、pacmanを使ってやることもできます。
pacman::p_update(dplyr)
p_remove()
パッケージの削除はRstudioのパッケージマネージャー画面からも行うのがやりやすいですが、pacmanを使ってサクっとアンインストールすることも可能です。
pacman::p_delete(ggbeeswarm)
p_opendir()
Rのコマンドラインで作業しているときに、以下の方法でパッとエクスプローラーアプリで開くことが出来ます。 パス指定も可能なため、任意の場所で実行可能です。
pacman::p_opendir(".")
私が確認した感じだと、Windowsではエクスプローラーが、WSL2とUbuntuのターミナルではneovim+ファイラーがターミナル内で開きました。MacでもFinderが開くと思いますが未確認です🤔
p_citation()
p_functions()
p_vignette()
稀に説明書通りにやってもパッケージが動かなくて困ることがあります。以下はそういったときの原因究明・問題解決に役に立ちそうです。
パッケージがなぜか動作しない時の原因に、「入っているはずの依存パッケージがインストールされていない」があります。 このような場合には以下の関数が役に立ちます。
p_library()
p_isinstalled()
これもRを触っていれば一回くらいは出くわすだろう、パッケージインストールに失敗するときのエラーです。エラーは大概以下のような表示です。
Error in install.packages : ERROR: failed to lock directory ‘C:\Program Files\R\R-4.0.1\library’ for modifying
Try removing ‘C:\Program Files\R\R-4.0.1\library/00LOCK’
https://community.rstudio.com/t/error-install-packages-failed-to-lock-directory/40018
このエラーメッセージは多くの人を悩ませるエラーですが、解決方法はエラーの出ているファイル”00LOCK”を削除することです。
あるいは、—no-lockオプションを使ったインストールも対策になります。
install.packages("Rcpp", INSTALL_opts = c('--no-lock'))
LinuxまたはMacなら[ref]WindowsのPowerShellからも多分いけると思います。[/ref]、コンソール上からR CMDコマンドを使うのも一つです。
R CMD INSTALL --no-lock Rcpp
前置きが長くなりましたが、pacmanの以下のパッケージを利用することで”00LOCK”の削除が容易にできます。
p_unlock()
以上、今回はpacmanパッケージを紹介しました!install.packages()
の代替として普段使いできるパッケージですので、是非ご活用ください🌟