違いは何であるrequire()
とはlibrary()
?
library()
大音量で早期に、関連するエラーメッセージ(パッケージがインストールされていないか、ロードできなかった場合)ですぐに失敗するrequire()
ため、エラーは発生せず、サイレントにブール値FALSEが返され、破棄されます。そしてコードは、後で、よりひそか失敗するError: object “bar” not found
(例えば)ライン175上の
違いは何であるrequire()
とはlibrary()
?
library()
大音量で早期に、関連するエラーメッセージ(パッケージがインストールされていないか、ロードできなかった場合)ですぐに失敗するrequire()
ため、エラーは発生せず、サイレントにブール値FALSEが返され、破棄されます。そしてコードは、後で、よりひそか失敗するError: object “bar” not found
(例えば)ライン175上の
回答:
すでに与えられた良いアドバイスに加えて、私はこれを追加します:
たとえばthierryによって提供されるようなエラーチェックループなどで実際にそれが返す値を使用するのでrequire()
ない限り、使用を避けるのがおそらく最善です。
他のほとんどの場合library()
、を使用することをお勧めします。これは、パッケージが使用できない場合、パッケージのロード時にエラーメッセージが表示されるためです。require()
パッケージが存在しない場合、エラーなしで失敗します。これは、パッケージをインストールする必要がある(または、スペルが間違っているために存在しない)かどうかを調べるのに最適な時期です。エラーフィードバックを早期に適切なタイミングで取得することで、ライブラリルーチンを使用しようとしたときに、後でコードが失敗する理由を追跡することで、頭痛の種を回避できます。
日常の仕事にはそれほど多くはありません。
ただし、両方の機能のドキュメントによると( ?
関数名の前にを Enterます)、require
警告が出力され、パッケージが見つからない場合は続行されますがlibrary
、エラーがスローされるため、関数内で使用されます。
require
は、パッケージをlibraries
と呼ばないようにすることです。これは、R-cognoscentiを壁に押し上げる慣習です。library
パッケージが座るディレクトリの場所です。
require
、しない限り、あなたは、戻り値をチェックし(その場合には、通常、例えば、より良い選択肢がありますloadNamespace
)。
もう1つの利点はrequire()
、デフォルトで論理値を返すことです。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)
}
}
プロのヒント:
スクリプト内で使用する場合、などのrepos
パラメータを指定することにより、ダイアログ画面を回避できます。install.packages()
install.packages(package, repos="http://cran.us.r-project.org")
あなたは、ラップすることができますrequire()
し、library()
中suppressPackageStartupMessages()
に、よく、抑制パッケージの起動メッセージを、また、パラメータを使用しrequire(..., quietly=T, warn.conflicts=F)
、必要に応じてインストールを静けさを保つために。
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行目ではなく、「object 'foo' not found」というエラーメッセージが表示されます。エラー「「bla」というパッケージはありません」。
の唯一の許容可能なユースケース require
他のいくつかの回答が示すは、戻り値がすぐにチェックされる場合です。これはかなり一般的なパターンですが、これらの場合でも、存在チェックとパッケージのロードを分離する方が適切です(推奨されます。以下を参照)。
より技術的に、require
実際に呼び出しlibrary
(パッケージがすでに取り付けられていなかった場合-内部require
従って冗長チェックを行うため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
}
{knitr}、{bookdown}、および他の多くのパッケージの作者であるYihui Xie は次のように述べています。
ご列席の皆様、私は以前にこれを言ったことがあります:require()はRパッケージをロードするための間違った方法です。代わりにlibrary()を使用してください
他の誰よりも人気のあるRパッケージの作者であるHadley Wickham
library(x)
データ分析スクリプトで使用します。[…]使用する必要はありませんrequire()
(requireNamespace()
ほとんどの場合、より優れています)
class::function
ですべての関数を呼び出さない限り、それをlibrary()
正確に回避するために使用してください。
?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
library
代わりに実装を修正する強力な理由だと私は主張します(現在Rに同梱されている両方の関数は非常に混乱しています)。
loadNamespace
せずにパッケージをロードしてその名前空間を返すを使用できます。