[英]R check list of packages, then load or install
在我的 R 代碼的開頭,我想檢查我是否在軟件包列表中安裝了一個軟件包,如果沒有,則安裝該軟件包然后加載它。 我的代碼如下所示:
packages <- c("dplyr", "ggplot2")
for (p in packages)
{
if (library(p, logical.return= TRUE) == TRUE)
{
lapply(p, library, character.only = TRUE)
} else
{
install.packages(p)
lapply(p, library, character.only = TRUE)
}
}
我可以在終端中看到每次運行這個單元時(順便說一句,我使用的是帶有 R 內核的 jupyterlab),我知道這些包已經安裝,但我可以在我的終端中看到它會再次安裝這些包,所以有一個這里有明顯的缺陷,只是不明顯的缺陷是什么。 我是 R 的新手,所以有沒有更好的方法來做到這一點?
謝謝
您的代碼失敗,因為您沒有在if
條件中使用character.only
,因此您的library
語句嘗試查找名為p
的包。 使用require
而不是library
解決方案(require 已經返回 TRUE 或 FALSE,具體取決於安裝狀態),與您的代碼相比,它有點清理:
packages <- c("dplyr","ggplot2")
for(p in packages)
{
tryCatch(test <- require(p,character.only=T),
warning=function(w) return())
if(!test)
{
print(paste("Package", p, "not found. Installing Package!"))
install.packages(p)
require(p)
}
}
請注意,這將始終附加要檢查的包的命名空間。 因此,如果您只想安裝丟失的軟件包而不加載它們,那么您問題下的評論中提到的解決方案效果更好。
實現此目的的一種方法是使用installed.packages()
函數檢查它是否已installed.packages()
。 然后,您還可以使用.packages()
函數檢查加載了哪些包。
當你實現這個時,它看起來像這樣:
# Declare packages
packages <- c("dplyr","ggplot2","magrittr")
# Loop through each package
for (package in packages) {
# Install package
# Note: `installed.packages()` returns a vector of all the installed packages
if (!package in installed.packages()) {
# Install it
install.packages(
package,
dependencies = TRUE
)
}
# Load package
# Note: `.packages()` returns a vector of all the loaded packages
if (!package in .packages()) {
# Load it
library(
package,
character.only = TRUE
)
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.