web-dev-qa-db-ja.com

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

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

500
Marco

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

ただし、両方の関数のドキュメント(関数名の前に?を付けてenterキーを押すことでアクセス)によれば、requireは警告を出力し、パッケージが見つからない場合は続行するため、libraryはエラーをスローします。 。

328
richiemorrisroe

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")
    }
}
241
Thierry

以下のように、必要な場合にだけパッケージをインストールする場合は、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)を使用してインストールを静かにすることもできます。

62
Daniel Sparing

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

require() あなたが実際にそれが返す値を使うことになるのでなければ、例えばthierryで与えられたようなエラーチェックループで使わないでください).

他のほとんどの場合、library()を使用する方が良いでしょう。パッケージが利用できない場合、これはパッケージのロード時にエラーメッセージを出すからです。パッケージが存在しない場合、require()はエラーなしで失敗します。これは、パッケージをインストールする必要があるかどうか(またはスペルが間違っているために存在しない可能性がある場合でも)を見つけるのに最適な時期です。エラーフィードバックを早くそして適切な時期に取得することで、ライブラリルーチンを使用しようとしたときに後のコードが失敗する理由を突き止めて頭痛の種を避けることができます。

56
dww

常に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を内部的に呼び出します(パッケージがまだアタッチされていない場合— requirealsoはパッケージが既にロードされているかどうかを確認するため、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開発者は同意します。

Yihui Xie 、{knitr}、{bookdown}および他の多くのパッケージの著者 says

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

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

データ分析スクリプトでlibrary(x)を使用します。 […] require()requireNamespace()を使用する必要はほとんどありません)

39
Konrad Rudolph
?library

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

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

19
dwstu

違いについての私の最初の理論は、libraryは既にロードされているかどうかに関わらずパッケージをロードするということです。つまり、requireはロードされていることをチェックするだけです。特定のパッケージに依存している関数内で)しかし、ドキュメントはこれに異議を唱えており、どちらの機能もすでにロードされているパッケージを再ロードしないことを明示的に述べています。

7
dsb

これはすでにロードされているパッケージとの違いのようです。 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
3
Shape