require()
とlibrary()
の違いは何ですか?
日常の仕事にはそれほど多くはありません。
ただし、両方の関数のドキュメント(関数名の前に?
を付けてenterキーを押すことでアクセス)によれば、require
は警告を出力し、パッケージが見つからない場合は続行するため、library
はエラーをスローします。 。
require()
のもう1つの利点は、デフォルトで論理値を返すことです。パッケージがロードされている場合はTRUE
、ロードされていない場合はFALSE
。
> test <- library("abc")
Error in library("abc") : there is no package called 'abc'
> test
Error: object 'test' not found
> test <- require("abc")
Loading required package: abc
Warning message:
In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE, :
there is no package called 'abc'
> test
[1] FALSE
そのため、以下のような構造でrequire()
を使うことができます。あなたが私たちのRのインストールにあなたのコードを配布したいなら、パッケージがインストールされていないかもしれないのが主に便利です。
if(require("lme4")){
print("lme4 is loaded correctly")
} else {
print("trying to install lme4")
install.packages("lme4")
if(require(lme4)){
print("lme4 installed and loaded")
} else {
stop("could not install lme4")
}
}
以下のように、必要な場合にだけパッケージをインストールする場合は、require()
を使用できます。
if (!require(package, character.only=T, quietly=T)) {
install.packages(package)
library(package, character.only=T)
}
複数のパッケージを使うことができます
for (package in c('<package1>', '<package2>')) {
if (!require(package, character.only=T, quietly=T)) {
install.packages(package)
library(package, character.only=T)
}
}
プロのアドバイス:
スクリプト内で使用するときは、次のようにinstall.packages()
のrepos
パラメータを指定することでダイアログ画面を回避できます。
install.packages(package, repos="http://cran.us.r-project.org")
require()
とlibrary()
をsuppressPackageStartupMessages()
でラップして、パッケージの起動メッセージを表示しないようにすることができます。また、必要に応じてパラメータrequire(..., quietly=T, warn.conflicts=F)
を使用してインストールを静かにすることもできます。
既に与えられた良いアドバイスに加えて、私はこれを追加するでしょう:
require()
あなたが実際にそれが返す値を使うことになるのでなければ、例えばthierryで与えられたようなエラーチェックループで使わないでください).
他のほとんどの場合、library()
を使用する方が良いでしょう。パッケージが利用できない場合、これはパッケージのロード時にエラーメッセージを出すからです。パッケージが存在しない場合、require()
はエラーなしで失敗します。これは、パッケージをインストールする必要があるかどうか(またはスペルが間違っているために存在しない可能性がある場合でも)を見つけるのに最適な時期です。エラーフィードバックを早くそして適切な時期に取得することで、ライブラリルーチンを使用しようとしたときに後のコードが失敗する理由を突き止めて頭痛の種を避けることができます。
library
を使用します。決して1 require
を使用します。(1 ほとんどは決してない。 多分。)
一言で言えば、これは、require
を使用するときに、コードが異なる誤った結果を生成する可能性があるためですエラーを通知せずに。これはまれですが、仮説ではありません! {dplyr}をロードできるかどうかに応じて--- [異なる結果をもたらすのこのコードを検討してください。
require(dplyr)
x = data.frame(y = seq(100))
y = 1
filter(x, y == 1)
これは微妙に間違った結果につながる可能性があります。 library
の代わりにrequire
を使用すると、ここでエラーがスローされ、何かが間違っていることを明確に通知します。 これは良い 。
また、他のすべての失敗のデバッグをより困難にします。スクリプトの最初でパッケージをrequire
し、500行目でエクスポートを使用すると、500行目ではなく「オブジェクト 'foo'が見つかりません」というエラーメッセージが表示されます。エラー「「bla」というパッケージはありません」。
require
の唯一の許容されるユースケースは、他の回答の一部が示すように、戻り値がすぐにチェックされる場合です。これはかなり一般的なパターンですが、これらの場合でも、存在チェックとパッケージのロードを分離する方が適切です(そして、以下を参照してください)。
より技術的には、require
は実際にlibrary
を内部的に呼び出します(パッケージがまだアタッチされていない場合— require
alsoはパッケージが既にロードされているかどうかを確認するため、library
は冗長チェックを実行します)。以下にrequire
の簡略化された実装を示します。
require = function (package) {
already_attached = paste('package:', package) %in% search()
if (already_attached) return(TRUE)
maybe_error = try(library(package, character.only = TRUE))
success = ! inherits(maybe_error, 'try-error')
if (! success) cat("Failed")
success
}
Yihui Xie 、{knitr}、{bookdown}および他の多くのパッケージの著者 says :
ご列席の皆様、私はこれを以前に言ったことがあります:require()はRパッケージをロードする間違った方法です。代わりにlibrary()を使用してください
Hadley Wickham 、他の誰よりも人気のあるRパッケージの著者
データ分析スクリプトで
library(x)
を使用します。 […]require()
(requireNamespace()
を使用する必要はほとんどありません)
?library
そして、あなたは見るでしょう:
library(package)
とrequire(package)
はどちらもpackage
という名前でパッケージをロードし、それを検索リストに追加します。require
は他の関数の中で使うように設計されています。パッケージが存在しない場合はFALSE
を返し、(デフォルトではlibrary()
のようなエラーではなく)警告を出します。どちらの機能も現在ロードされているパッケージのリストをチェックおよび更新し、すでにロードされているパッケージを再ロードすることはしません。 (そのようなパッケージを再ロードしたい場合は、最初にdetach(unload = TRUE)
またはunloadNamespace
を呼び出してください。)検索リストに載せずにパッケージをロードしたい場合は、requireNamespace
を使用してください。
違いについての私の最初の理論は、library
は既にロードされているかどうかに関わらずパッケージをロードするということです。つまり、require
はロードされていることをチェックするだけです。特定のパッケージに依存している関数内で)しかし、ドキュメントはこれに異議を唱えており、どちらの機能もすでにロードされているパッケージを再ロードしないことを明示的に述べています。
これはすでにロードされているパッケージとの違いのようです。 requireとlibraryの両方がパッケージをロードしないことは事実ですが。ライブラリは、チェックして終了する前に他の多くのことを行います。
とにかく2mil回実行する関数の先頭から "require"を削除することをお勧めしますが、何らかの理由でそれを維持する必要がある場合はrequireは技術的には速いチェックです。
microbenchmark(req = require(microbenchmark), lib = library(microbenchmark),times = 100000)
Unit: microseconds
expr min lq mean median uq max neval
req 3.676 5.181 6.596968 5.655 6.177 9456.006 1e+05
lib 17.192 19.887 27.302907 20.852 22.490 255665.881 1e+05