All Articles
    Search by

    [パッケージ紹介] まだlibrary()で消耗してるの? library()関数よりもスマートに読み込む{pacman}パッケージ

    はじめに

    こんにちは! :smile: 最近ブログの書き方をいろいろと模索しています。この記事からはスタイルをかなり変えてみたので、もしかしたら表示がこれまでと違うかもしれません。。 でもこれでかなり効率化できたはず・・・!

    さておき!今回はR言語に欠かせないパッケージ読み込み操作を簡単にする、pacmanパッケージについて紹介します!海外のR関連ブログを見ると5人に2人くらい?は使っている気がします。

    組み込み関数のlibrary()よりもスマートにパッケージを読み込むことができるpacman::p_load()関数をはじめ、R解析では欠かせないパッケージの管理作業を極めて効率化することのできるオススメパッケージです。

    pacmanパッケージはシンプルなパッケージローダーとして有名ですが、実はインストールエラーに対処する時にも役に立つ関数があります。この記事の最後の方でパッケージインストールエラーの対処に便利な関数をまとめていますので、頭の片隅に入れておくと良いと思います!

    関数紹介

    読み込み:p_load()

    正直これだけ覚えておけば大丈夫です。 以下のように使います。

    pacman::p_load(dplyr, tidyr)

    通常であれば、library(pacman)pacmanパッケージを呼び出してからでなければp_load()関数は使用できませんが、パッケージ名::関数()という指定の仕方をするとパッケージを呼び出すこと無く関数を使用することができます

    pacmanはコンパクトなパッケージなので、上記例のように呼び出すのがp_load()だけでも全く問題ありません。

    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パッケージを読み込む操作によって実際に読み込まれた子ライブラリたちのリストです。ggplot2dplyrが自動的に使えるようになるのは書かれている通りです。 次に、Conflictsに書かれているのは同じ名前の関数が衝突していることを示しています。そして、dplyrの関数がstatsの関数をマスクして無効化している旨が書かれています。

    環境によってはカラフルで素敵ですが、正直このメッセージが毎回出てくると邪魔です。 昔はsuppresspackagestartupmessages()関数なんかをよく使ったものですが、それはそれで面倒です(こんな長い関数名覚えられないし)。

    これがpacman::p_loadだと以下のようになります。

    r$> pacman::p_load(tidyverse)
    
    r$> 

    何もないです。無です。非常にシンプルで良いですよね。

    ちなみに、複数パッケージを同時に読み込むこともできます

    pacman::p_load(tidyverse, ComplexHeatmap)

    p_load()のメリット:無ければインストールしてくれる

    稀ですが、インストールしてあると思いきやされていなかった場合があります。あるいは、自分の書いた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()
      • ビネット(Rでは説明書的なもの指す)を参照することができます。

    パッケージインストールエラーに役立ちそうな関数

    稀に説明書通りにやってもパッケージが動かなくて困ることがあります。以下はそういったときの原因究明・問題解決に役に立ちそうです。

    パッケージがインストールされているか確認

    パッケージがなぜか動作しない時の原因に、「入っているはずの依存パッケージがインストールされていない」があります。 このような場合には以下の関数が役に立ちます。

    • インストール済みのパッケージ一覧を表示: p_library()
    • インストールされているかを直接確認: p_isinstalled()

    “Failed to lock directory”問題を回避

    これも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()
      • 00LOCKディレクトリを削除することができます。

    まとめ

    以上、今回はpacmanパッケージを紹介しました!install.packages()の代替として普段使いできるパッケージですので、是非ご活用ください🌟

    Published Apr 23, 2022

    © 2020-2024 Hiroyuki Odake