回答:
提案された関数のいくつかの順列が機能しcharacter.only
ますTRUE
。ただし、引数をに指定した場合のみです。簡単な例:
lapply(x, require, character.only = TRUE)
x
か?
lapply
トリックをにネイティブで追加した場合は、うまくいきlibrary()
ます。:できると言うことは素晴らしいことlibrary(c("plyr", "umx"))
CRANパッケージパックマン私は(Dason Kurkiewiczでオーサリング)維持することは、これを達成することができます:
したがって、ユーザーは次のことができます。
## install.packages("pacman")
pacman::p_load(dplyr, psych, tm)
パッケージが見つからない場合はp_load
、CRANまたはBioconductorからダウンロードします。
p_load
ですか?などのload_packages
わかりやすい名前を付けると、関数の意図がより明確になります。
p_
ます。さらに、ライブラリを少し使用する傾向があり、それは追加の7文字です。7文字x〜1000000ライフタイム関数の使用x 1文字あたり0.5秒= 3500000秒。それは私たちが彼らに返したプログラマーの人生の58333.33分、972.2222時間、または40.50926日です:-)いずれにしても、私たちの目標は2月1日までにCRANにプッシュすることです
p_
プレフィックスの根拠はかなり疑わしいものです。簡潔さが問題である場合は、p_
接頭辞を完全に削除してください。実際、そのような接頭辞を使用することは、他の言語では一般的に正当な理由で推奨されていません(私はHadley fct_
にforcatsでの彼のナンセンスに関して同じことを伝えました)。パッケージの使用目的は修飾された名前空間()であるので、これは特に当てはまりますpacman::
。
これでうまくいくはずです:
lapply(x, FUN = function(X) {
do.call("require", list(X))
})
(重要なのは、args
引数がリストでdo.call(what, args)
なければならないということです---それが単一の要素しか持っていなくても!)
パッケージを同時にインストールおよびロードしたい人のために、私はこのリンクからこの機能に出くわしました
# 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)
代替オプションはパッケージから提供されますeasypackages
。インストールしたら、最も直感的な方法でパッケージをロードできます。
libraries("plyr", "psych", "tm")
パッケージには、いくつかのパッケージをインストールする機能も含まれています。
packages("plyr", "psych", "tm")
参照はこちら。
library
関数の「ライブラリ」は、パッケージがインストールされている場所、つまりパッケージライブラリを指します。複数のパッケージをロードしlibraries
ても意味がありません。別のことを行う別の関数packages
があると、これはさらに悪化します。名前付けはソフトウェアエンジニアリングでは難しい問題ですが、実際にはそうです。これらの名前は特に悪いです。
libraries
が意味をなさないことに同意しません。の複数形でlibrary
、library
単一のパッケージをロードします。libraries
複数のパッケージをロードします。library
「単一のライブラリからロードする」という意味と考え、「libraries
複数のライブラリからロードする」という意味に拡張すると、おそらく直感的ではありませんが、それは意図ではありません。名前でもうれしいlibraries
。
lubripackパッケージを使用するだけで、新しいパッケージがきちんとインストールされ、すべてが1行でロードされます。
lubripack("plyr", "psych", "tm")
以下は、RStudioで上記のコードを実行した後の出力です。
以下のコードを実行してパッケージをダウンロードし、GitHubからインストールします。GitHubアカウントは必要ありません。
library(devtools)
install_github("espanta/lubripack")
次の関数を使用します。
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)
}
これはロードを試み、失敗した場合はインストールしてから再度ロードを試みます。
@daroczigが提供するコードは、require
をlibrary
で置き換えlapply
、invisible()
関数内で呼び出しをラップすることで改善できると思います。したがって、改善されたコードは次のようになります。
invisible(lapply(x, library, character.only = TRUE))
このコードは、次の理由で改善されています。
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’
lapply()
この場合、呼び出しによって返されて出力されるリストオブジェクトは意味がないため、出力を非表示にすることは理にかなっています。分析作業にR Notebookを使用するとします。このinvisible()
関数を使用すると、リストオブジェクトの内容が抑制され、レンダリングされたNotebook ファイルが乱雑にならないようになります。