簡體   English   中英

R 檢查包列表,然后加載或安裝

[英]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.

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