require()とlibrary()の違いは何ですか?


565

違いは何であるrequire()とはlibrary()



7
@Yihuiのブログ投稿へのリンクを追加します(彼が回答のバージョンを投稿したくない場合を除く)。yihui.name/en/2014/07/library-vs-require
MichaelChirico

4
@Yihuiのブログ記事の要約:「ご列席の皆様、私は以前に言ったことがあります。require()はRパッケージをロードするための間違った方法です。代わりにlibrary()を使用してください」
De Novo

1
@DanHall ... library()大音量で早期に、関連するエラーメッセージ(パッケージがインストールされていないか、ロードできなかった場合)ですぐに失敗するrequire()ため、エラーは発生せず、サイレントにブール値FALSEが返され、破棄されます。そしてコードは、後で、よりひそか失敗するError: object “bar” not found(例えば)ライン175上の
SMCI

1
@KonradRudolph:完了しました!ご意見ありがとうございます。
Marco、

回答:


86

すでに与えられた良いアドバイスに加えて、私はこれを追加します:

たとえばthierryによって提供されるようなエラーチェックループなどで実際にそれが返す値を使用するのでrequire() ない限り、使用を避けるのがおそらく最善です。

他のほとんどの場合library()、を使用することをお勧めします。これは、パッケージが使用できない場合、パッケージのロード時にエラーメッセージが表示されるためです。require()パッケージが存在しない場合、エラーなしで失敗します。これは、パッケージをインストールする必要がある(または、スペルが間違っているために存在しない)かどうかを調べるのに最適な時期です。エラーフィードバックを早期に適切なタイミングで取得することで、ライブラリルーチンを使用しようとしたときに、後でコードが失敗する理由を追跡することで、頭痛の種を回避できます。


356

日常の仕事にはそれほど多くはありません。

ただし、両方の機能のドキュメントによると( ?関数名の前にを Enterます)、require警告が出力され、パッケージが見つからない場合は続行されますがlibrary、エラーがスローされるため、関数内で使用されます。


1
#richiemorrisroe:ありがとう。Rコードの最初に必要なパッケージをロードする場合、どのパッケージを選択しても問題ないということですか?
Marco、

6
関数内でパッケージをロードしない限り、実際には違いはありません。requireを使用してすべてのパッケージをロードしましたが、質問を見てヘルプを読むまで、違いはわかりませんでした。
richiemorrisroe

45
私が使用するもう1つの理由requireは、パッケージをlibrariesと呼ばないようにすることです。これは、R-cognoscentiを壁に押し上げる慣習です。libraryパッケージが座るディレクトリの場所です。
IRTFM 2011

22
彼らは非常に関連する違いがあります。使用しないでくださいrequireしない限り、あなたは、戻り値をチェックし(その場合には、通常、例えば、より良い選択肢がありますloadNamespace)。
Konrad Rudolph

256

もう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")
    }
}

65

次の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)、必要に応じてインストールを静けさを保つために。


46

常に使用してくださいlibrary。決して1を使用require

1ほとんどない。たぶん。)

簡単に言うと、これは、を使用すると、エラーを通知せずにrequire、コードが異なる誤った結果を生成する可能性があるためです。これはまれですが、仮説ではありません!{dplyr}をロードできるかどうかに応じて異なる結果生成する次のコードを検討してください。

require(dplyr)

x = data.frame(y = seq(100))
y = 1
filter(x, y == 1)

これは微妙に間違った結果につながる可能性があります。ここでエラーlibraryrequireスローする代わりにを使用すると、何かが間違っていることを明確に通知します。これはいいです。

また、他のすべての障害のデバッグがより困難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
}

経験豊富なR開発者は同意します:

{knitr}、{bookdown}、および他の多くのパッケージの作者であるYihui Xie 次のように述べています

ご列席の皆様、私は以前にこれを言ったことがあります:require()はRパッケージをロードするための間違った方法です。代わりにlibrary()を使用してください

他の誰よりも人気のあるRパッケージの作者であるHadley Wickham

library(x)データ分析スクリプトで使用します。[…]使用する必要はありませんrequire()requireNamespace()ほとんどの場合、より優れています)


私はまったく同じことを指摘するつもりでしたが、構文class::functionですべての関数を呼び出さない限り、それをlibrary()正確に回避するために使用してください。
Ghost

19
?library

そしてあなたは見るでしょう:

library(package)そして、require(package)どちらもパッケージを名前でロード packageして、検索リストに入れます。require他の関数内で使用するように設計されています。パッケージが存在しない場合は(デフォルトではFALSEエラーでlibrary()はなく)戻り、警告が表示されます。どちらの関数も、現在ロードされているパッケージのリストをチェックして更新し、すでにロードされているパッケージを再ロードしません。(そのようなパッケージを再ロードする場合は、detach(unload = TRUE)またはを unloadNamespace最初に呼び出します。)検索リストに入れずにパッケージをロードする場合は、を使用しますrequireNamespace


9

違いについての私の最初の理論libraryは、パッケージが既にロードされているかどうかに関係なく、つまりすでにロードされているパッケージをリロードするかもしれないが、ロードされているかどうかをrequireチェックするか、そうでない場合はロードするというものでした(したがって、関数での使用)特定のパッケージに依存しています)。ただし、ドキュメントはこれを否定し、どちらの関数も既にロードされているパッケージを再ロードしないことを明示的に述べています。


18
これは興味深いですが、質問に対する答えではありません...?
ベンボルカー、2014年


3

これは既にロードされたパッケージとの違いのようです。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に同梱されている両方の関数は非常に混乱しています)。
Konrad Rudolph

@KonradRudolphよく、誰かがライブラリを修正する場合は、バージョンによるロードを明示的に有効にし、添付ファイルを引数オプションにすることもできます
Shape

はい、私は完全に同意しますが、それらはパフォーマンスだけでなくセマンティクスを変更します。とにかく、バージョン管理は、残念ながらRのパッケージでは機能しません。私はこれの代わりに取り組んでいます(本当に!)。アタッチについては、アタッチloadNamespaceせずにパッケージをロードしてその名前空間を返すを使用できます。
Konrad Rudolph
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.