630

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

4

8 に答える 8

375

日常業務ではほとんどありません。

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

于 2011-04-08T13:14:53.777 に答える
265

のもう 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")
    }
}
于 2011-04-08T21:52:23.557 に答える
130

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

返される値を実際に使用する場合をrequire() 除き、使用を避けるのがおそらく最善です。

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

于 2015-02-10T01:24:54.410 に答える
11

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

于 2013-10-09T15:35:04.197 に答える
5

これは、すでにロードされているパッケージとの違いのようです。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
于 2016-02-22T14:34:37.557 に答える