パッケージ - require()とlibrary()の違いは何ですか?



r パッケージ インストール (6)

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

https://src-bin.com


Answer #1

常にlibrary使用してください。 決して使用するrequireません。

(ほとんど決してないかもしれない 。)

一言で言えば、これは、 requireを使用requireエラーを通知することなく 、コードが異なる、誤った結果をもたらす可能性があるからです。 これはまれですが仮説ではありません! {dplyr}をロードできるかどうかによって異なる結果もたらすこのコードを検討してください:

require(dplyr)

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

これは間違った結果をもたらすことがあります。 require代わりにlibrary使うとここにエラーrequireスローされ、何かが間違っていることが明確に伝えられます。 これは良いことです。

また、スクリプトの最初にパッケージをrequire 、行500でエクスポートを使用すると、行500に "object 'foo' not found"というエラーメッセージが表示されます。エラー "bla 'というパッケージはありません。

requireの唯一受け入れ可能なユースケースは、戻り値がすぐにチェックされるときです。他の答えのいくつかが示すとおりです。 これはかなり一般的なパターンですが、このような場合でも、存在チェックとパッケージの読み込みを分離する方が良い(推奨する、下記参照)。

より技術的にはrequire実際にlibrary内部的に呼び出すrequireがあります(パッケージがまだ添付されていない場合 - libraryはパッケージが既に読み込まれているかどうかをチェックするため、 requireは冗長チェックを行います)。 それが何をしているかを説明requireために、 require単純化された実装が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}などの作者の作者:

皆さん、私はこれまでにこう言いました。require()はRパッケージを読み込む間違った方法です。 代わりにlibrary()を使用する

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

データ解析スクリプトではlibrary(x)使用しlibrary(x) 。 [...] require()を使うrequire()はありません( requireNamespace()はほとんど常に良いです)


Answer #2

require()はすべての追加パッケージをロードする


Answer #3

ここでは既にロードされているパッケージの違いがあるようです。 requireとlibraryの両方がパッケージをロードしないことは事実ですが。 ライブラリはチェックして終了する前に、他にもたくさんのことがあります。

とにかく2milの時間を実行している関数の先頭から「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

Answer #4

必要な場合にのみパッケージをインストールする場合は、 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")
    
  • suppressPackageStartupMessages() require()library()をパッケージして、パッケージ起動メッセージを抑制し、インストールを維持するために必要な場合はrequire(..., quietly=T, warn.conflicts=F)パラメータも使用できます。静か。


Answer #5

毎日の仕事にはあまり多くありません。

しかし、両方の関数のドキュメント(関数名の前に?をつけてアクセスすることによってアクセスされる)によれば、関数内ではrequireが使用され、警告が出力され、パッケージが見つからない場合にはrequireが使用されます。


Answer #6

違いについての私の最初の理論は、既にロードされているかどうかにかかわらず、 libraryロードされているかどうかにかかわらず、ロード済みのパッケージをリロードすることができます。特定のパッケージに依存する関数)。 しかし、この文書はこれを否定し、いずれの関数もすでにロードされているパッケージを再ロードしないことを明示的に述べています。





packages