簡體   English   中英

require() 和 library() 有什么區別?

[英]What is the difference between require() and library()?

require()library()什么區別?

日常工作中沒有太多的人。

但是,根據這兩個函數的文檔(通過在函數名稱之前放置?並按回車鍵來訪問),在函數內部使用了require ,因為它會輸出警告並在未找到包時繼續,而library將拋出錯誤.

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()除非您實際上將使用它返回的值,例如在某些錯誤檢查循環中,例如由 thierry 給出。

在大多數其他情況下,最好使用library() ,因為如果包不可用,這將在包加載時給出錯誤消息。 如果包不存在, require()只會失敗而不會出錯。 這是確定是否需要安裝軟件包的最佳時機(或者可能因為拼寫錯誤而根本不存在)。 在相關時間及早獲得錯誤反饋將避免可能的頭痛,因為它可以追蹤為什么后來的代碼在嘗試使用庫例程時失敗

如果您想在且僅在必要時安裝軟件包,您可以使用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)安靜的。

始終使用library 永遠不要使用require

tl;dr: require打破了健壯軟件系統的基本規則之一:盡早失敗

簡而言之,這是因為在使用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唯一可接受的用例是立即檢查其返回值,如其他一些答案所示。 這是一個相當常見的模式,但即使在這些情況下,最好(並推薦,見下文)將存在檢查和包的加載分開。 也就是說:在這些情況下使用requireNamespace而不是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()

Hadley Wickham是比其他任何人都更受歡迎的 R 軟件包的作者,他說

在數據分析腳本中使用library(x) [...] 你永遠不需要使用require()requireNamespace()幾乎總是更好)

?library

你會看到:

library(package)require(package)都加載名為package並將其放在搜索列表中。 require是為在其他函數中使用而設計的; 如果包不存在,它返回FALSE並給出警告(而不是默認情況下library()所做的錯誤library() 這兩個函數都會檢查和更新當前加載的包列表,並且不會重新加載已經加載的包。 (如果要重新加載這樣的包, unloadNamespace調用detach(unload = TRUE)unloadNamespace 。)如果要加載包而不將其放在搜索列表中,請使用requireNamespace

我最初關於差異的理論是,無論是否已加載, library加載包,即它可能會重新加載已加載的包,而require僅檢查它是否已加載,或者如果未加載則加載它(因此使用在依賴某個包的函數中)。 然而,文檔反駁了這一點,並明確指出這兩個函數都不會重新加載已經加載的包。

這似乎是已經加載的包的區別。 雖然 require 和 library 都不會加載包,但確實如此。 圖書館在檢查和退出之前會做很多其他的事情。

無論如何,我建議從運行 200 萬次的函數的開頭刪除“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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM