一度に複数のパッケージをロードする


174

requireコマンドを何度も再入力せずに、一度にたくさんのパッケージをロードするにはどうすればよいですか?私は3つの方法を試しましたが、すべてクラッシュして燃えます。

基本的に、パッケージ名のベクトルを、それらをロードする関数に提供したいと思います。

x<-c("plyr", "psych", "tm")

require(x)
lapply(x, require)
do.call("require", x)

回答:


251

提案された関数のいくつかの順列が機能しcharacter.onlyますTRUE。ただし、引数をに指定した場合のみです。簡単な例:

lapply(x, require, character.only = TRUE)

@Tommy&daroczig-かっこいい それははるかにクリーンなソリューションです。私は後世のために、そしてOPの試みがうまくいかなかった理由についてそれが何を示すのかのために私のものを放っておくでしょう。
Josh O'Brien

4
部分的な文字マッチングを利用して、lapply(x、require、ch = T)またはlapply(x、require、c = T)を回避できます
Dason

@daroczigこのコードはパッケージをロードしますが、次の警告メッセージが表示されるのはなぜですか。 'x' 2:In(!loaded){:条件の長さが1より大きく、最初の要素のみが使用されます
Anusha

@Anusha:私はATMがわからない、あなたはあなたの中に何を持っていますxか?
daroczig

23
R :: baseがこのlapplyトリックをにネイティブで追加した場合は、うまくいきlibrary()ます。:できると言うことは素晴らしいことlibrary(c("plyr", "umx"))
ティム・

58

CRANパッケージパックマン私は(Dason Kurkiewiczでオーサリング)維持することは、これを達成することができます:

したがって、ユーザーは次のことができます。

## install.packages("pacman")
pacman::p_load(dplyr, psych, tm) 

パッケージが見つからない場合はp_load、CRANまたはBioconductorからダウンロードします。


7
+1!なぜあなたは短い名前を選んだのp_loadですか?などのload_packagesわかりやすい名前を付けると、関数の意図がより明確になります。
Paul Hiemstra、2014年

19
pはパッケージを表すので。便利でエクスポートされるパッケージ内のすべての関数は、で始まりp_ます。さらに、ライブラリを少し使用する傾向があり、それは追加の7文字です。7文字x〜1000000ライフタイム関数の使用x 1文字あたり0.5秒= 3500000秒。それは私たちが彼らに返したプログラマーの人生の58333.33分、972.2222時間、または40.50926日です:-)いずれにしても、私たちの目標は2月1日までにCRANにプッシュすることです
Tyler Rinker

3
約1年遅れましたが、最終的にCRANに提出しました。数日でアップするはずです。@trinker(または私)が公開したら、必ずこれを変更してください。
Dason

5
@タイラー私は何年も遅れていることはわかっていますが、p_プレフィックスの根拠はかなり疑わしいものです。簡潔さが問題である場合は、p_接頭辞を完全に削除してください。実際、そのような接頭辞を使用することは、他の言語では一般的に正当な理由で推奨されていません(私はHadley fct_にforcatsでの彼のナンセンスに関して同じことを伝えました)。パッケージの使用目的は修飾された名前空間()であるので、これは特に当てはまりますpacman::
Konrad Rudolph

5
@TylerRinkerこの問題に対抗できることをお詫びしますが、Rコミュニティはここでは単純に間違っていると本当に思います。事実上、他のすべての現代の言語はそれを正しく理解しています。—しかし、これが名前空間の目的です。パッケージライターの責任は、ずさんなプログラミング方法に対応するためではなく、パッケージを適切に使用するように人々を教育することです。
Konrad Rudolph

24

これでうまくいくはずです:

lapply(x, FUN = function(X) {
    do.call("require", list(X)) 
})

(重要なのは、args引数がリストでdo.call(what, args) なければならないということです---それが単一の要素しか持っていなくても!)


16

パッケージを同時にインストールおよびロードしたい人のために、私はこのリンクからこの機能に出くわしました

# ipak function: install and load multiple R packages.
# check to see if packages are installed. Install them if they are not, then load them into the R session.

ipak <- function(pkg){
new.pkg <- pkg[!(pkg %in% installed.packages()[, "Package"])]
if (length(new.pkg)) 
    install.packages(new.pkg, dependencies = TRUE)
sapply(pkg, require, character.only = TRUE)
}

# usage
packages <- c("ggplot2", "plyr", "reshape2", "RColorBrewer", "scales", "grid")
ipak(packages)

こんにちは、指定したスニペットからRファイルを作成しました。Amazon EMRサービスでそのスクリプトを実行すると、次のURLで指定されている次の出力が表示されます。pastie.org/10402378#3,10-11,13
Rubin Porwal

9

代替オプションはパッケージから提供されますeasypackages。インストールしたら、最も直感的な方法でパッケージをロードできます。

libraries("plyr", "psych", "tm")

パッケージには、いくつかのパッケージをインストールする機能も含まれています。

packages("plyr", "psych", "tm")

参照はこちら


関数名はやや混乱/混乱しています。library関数の「ライブラリ」は、パッケージがインストールされている場所、つまりパッケージライブラリを指します。複数のパッケージをロードしlibrariesても意味がありません。別のことを行う別の関数packagesがあると、これはさらに悪化します。名前付けはソフトウェアエンジニアリングでは難しい問題ですが、実際にはそうです。これらの名前は特に悪いです。
Konrad Rudolph

2
@KonradRudolph名前librariesが意味をなさないことに同意しません。の複数形でlibrarylibrary単一のパッケージをロードします。libraries複数のパッケージをロードします。library「単一のライブラリからロードする」という意味と考え、「libraries複数のライブラリからロードする」という意味に拡張すると、おそらく直感的ではありませんが、それは意図ではありません。名前でもうれしいlibraries
ジェイミーS

@JamieSしかし、それはまだ(通常)単一のライブラリからロードしています。ライブラリとパッケージを混同しているようです(公平に言うと、Rで一般的になりました)。「Rライブラリ」は、以前のコメントで述べたように、Rパッケージがインストールされている場所(ディレクトリ/ディレクトリ)を指します。 。この回答の例では、「plyr」、「psych」、「tm」はライブラリではなく、パッケージです。
Konrad Rudolph、

4

lubripackパッケージを使用するだけで、新しいパッケージがきちんとインストールされ、すべてが1行でロードされます。

lubripack("plyr", "psych", "tm")

以下は、RStudioで上記のコードを実行した後の出力です。

ここに画像の説明を入力してください

パッケージのインストール方法:

以下のコードを実行してパッケージをダウンロードし、GitHubからインストールします。GitHubアカウントは必要ありません。

library(devtools)
install_github("espanta/lubripack")

5
テキストの代わりに画像を使用すると思います
The Unfun Cat

3
これも、まだ答えられていない方法で質問に答えることはなく、主に自己宣伝のようです。
タイラーリンカー、2016年

あなたは正しい、私は暗黙のうちに質問に答えようとしました。それが質問への答えになることを望んでそれを明示的にしましょう。
Espanta 2016年

@TylerRinker元気ですか?
2016年

3

daroczigのソリューションに基づいて構築し、入力としてリストを指定したくない場合は、使用できます

# Foo
mLoad <- function(...) {
  sapply(sapply(match.call(), as.character)[-1], require, character.only = TRUE)
}

# Example 
mLoad(plyr, dplyr, data.table)

...より短い

lapply(list('plyr', 'dplyr', 'data.table'), require, character.only = TRUE)

2

次の関数を使用します。

mrip <- function(..., install = TRUE){
    reqFun <- function(pack) {
        if(!suppressWarnings(suppressMessages(require(pack, character.only = TRUE)))) {
            message(paste0("unable to load package ", pack,
                           ": attempting to download & then load"))
            install.packages(pack)
            require(pack, character.only = TRUE)
        }
    }
    lapply(..., reqFun)
}

これはロードを試み、失敗した場合はインストールしてから再度ロードを試みます。


2

@daroczigが提供するコードは、requirelibraryで置き換えlapplyinvisible()関数内で呼び出しをラップすることで改善できると思います。したがって、改善されたコードは次のようになります。

invisible(lapply(x, library, character.only = TRUE))

このコードは、次の理由で改善されています。

  1. library()require()前者はパッケージがインストールされていない場合にエラーを表示し、後者は警告を表示するだけなので、一般的にパッケージのロードよりも優先されます。さらに、をrequire()呼び出すlibrary()ので、library()直接使用しないでください。

    library("time")
    # Error in library("time") : there is no package called ‘time’
    
    require("time")
    # Loading required package: time
    # Warning message:
    # In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE,  :
    # there is no package called ‘time’
  2. lapply()この場合、呼び出しによって返されて出力されるリストオブジェクトは意味がないため、出力を非表示にすることは理にかなっています。分析作業にR Notebookを使用するとします。このinvisible()関数を使用すると、リストオブジェクトの内容が抑制され、レンダリングされたNotebook ファイルが乱雑にならないようになります。


1

pacmanをインストールしてロードするためのチェックを追加するためのTyler Rinkerの回答のわずかなmod:

#Install/load pacman
if(!require(pacman)){install.packages("pacman");require(pacman)}
#Install/load tons of packages
p_load(plyr,psych,tm)

引用を避けるため、p_loadソリューションが好きです!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.