![](/img/trans.png)
[英]What is the difference between library()/require() and source() in r?
[英]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
}
{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.