Eksik paketleri kontrol etmenin ve kurmanın zarif yolu?


337

Bugünlerde yazarlarla çok fazla kod paylaşıyor gibi görünüyorum. Birçoğu acemi / orta düzeydeki R kullanıcılarıdır ve zaten sahip olmadıkları paketleri kurmaları gerektiğinin farkında değildir.

Aramanın installed.packages(), yüklediğim ve eksik olduğum kişilerle karşılaştırmanın zarif bir yolu var mı ?


1
@krlmlr Kabul edilen cevap güncel değil ve revizyon gerekiyor? Benim için (birkaç hızlı test için) altında çalışır R version 3.0.2 (2013-09-25) x86_64-w64-mingw32/x64 (64-bit).
Brian Diggs

1
@BrianDiggs: Bu sorunu ele alan en az üç paket ortaya çıktı, sadece bir tanesine aşağıda atıfta bulunuldu. Dahası var mı - soru bu.
krlmlr

2
@krlmlr (Diğerlerinin) gerekli paketlere sahip olduğundan emin olmak için bir paket kullanma konusunda biraz ironik bir tavuk ve yumurta problemi var gibi görünüyor. Ama kesinlikle onları bilen birisinin bir cevap yazmasına değer.
Brian Diggs

2
@BrianDiggs: Bu kurulum kontrol paketinin önyüklenmesi gerekli bir sıkıntıdır, ancak küçük bir pakettir. Tabii ki, fonksiyonellik içine base
girmediği sürece

Yanıtlar:


304

Evet. Paket listeniz varsa, listeyi çıktıyla karşılaştırın installed.packages()[,"Package"]ve eksik paketleri yükleyin. Bunun gibi bir şey:

list.of.packages <- c("ggplot2", "Rcpp")
new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
if(length(new.packages)) install.packages(new.packages)

Aksi takdirde:

Kodunuzu bir pakete koyar ve bağımlılık yaparsanız, paketinizi yüklediğinizde bunlar otomatik olarak yüklenir.


11
Bence uygun sözdizimi: if(length(new.packages)>0) {install.packages(new.packages)}

5
@psql, Shine haklı, çünkü "> 0" if koşulu içinde "örtük". doğrulamak için bunu çalıştırın:new.packages <- c(1,2) length(new.packages) if(length(new.packages)){print("hello!")}else{print("oh no!")}
Andrea Cirillo

7
İnstall.packages dokümanı şöyle diyor: "Binlerce paket yüklendiğinde bu yavaş olabilir, bu nedenle adlandırılmış bir paketin yüklü olup olmadığını öğrenmek için bunu kullanmayın (system.file veya find.package kullanın ..."
Thomas Materna

2
Thomas ile aynı fikirde, bu requirekontrol etmek yerine daha iyi bir performans olurduinstalled.packages
Matthew

1
packratbunun için yapıldı. Tekrarlanabilir bir paket yönetim sistemidir. Bu şekilde yanlış yoldan gidiyoruz ve başka birinin çevresi ile uğraşıyor ve tekrarlanamaz. Packrat'ın paylaşılan kütüphaneler için kendi klasörü ve ortamı vardır. rstudio.github.io/packrat
mtelesha

231

Dason K. ve ben bunu güzelce yapabilen pacman paketine sahibiz . p_loadPaketteki işlev bunu yapar. İlk satır pacman'ın kurulu olduğundan emin olmaktır.

if (!require("pacman")) install.packages("pacman")
pacman::p_load(package1, package2, package_n)

1
Paketin durumu nedir? C-RAN'da göremiyorum.
MERose


6
Şimdi yükledim ve harika çalışıyor; üssün bir parçası olmalı!
AndyF

3
Bunun daha iyi olmasının tek yolu /, eğer kontrol edilirse ve bulunursa, otomatik olarak github'dan yükleme / yükleme olacaktır.
hava saldırısı

4
@NealBarsch, pacman'da sizin için bu satırı otomatik olarak if (!require("pacman")) install.packages("pacman")çağıran p_boot()ve panoya kopyalayan bir işlev varsa demek istiyorsan.
Tyler Rinker

72

Sadece dönüş değerini kullanabilirsiniz require:

if(!require(somepackage)){
    install.packages("somepackage")
    library(somepackage)
}

Kurulumdan librarysonra kullanıyorum çünkü kurulum başarılı değilse veya paket başka bir nedenden dolayı yüklenemiyorsa bir istisna atar. Bunu daha sağlam ve tekrar kullanılabilir hale getirirsiniz:

dynamic_require <- function(package){
  if(eval(parse(text=paste("require(",package,")")))) return True

  install.packages(package)
  return eval(parse(text=paste("require(",package,")")))
}

Bu yöntemin dezavantajı, paket adını gerçek için yapmadığınız tırnak işaretleri içinde iletmenizdir require.


4
Sen kullanarak Hayatını çok kolaylaştırabilirsiniz character.only = TRUEiçinde requireama sonra madenden cevap farklılaştırmak için bir şey yok sanırım.
Simon O'Hanlon

Bu güzel görünüyor ama en azından benim için çalışmıyor gibi görünüyor. Bunun sağlam sürümünü denediğimde, R "True True" ve "return eval" gibi nedenlerle başa çıkacağını bilmediği için iki hata mesajı alıyorum. Bu yüzden gerçekten böyle bir işlevi kütüphanemde varsa bir paket yükler ve aksi takdirde paketi yükler (ve daha sonra yükler) istiyorum. İdeal olarak daha sonra paketleri yüklemek için varsayılan olarak kullanacağım. En azından bunu yapmak mantıklı olacak ve biraz zaman kazandıracak gibi görünüyor.
Fabian Habersack

23
if (!require('ggplot2')) install.packages('ggplot2'); library('ggplot2')

"ggplot2" paketidir. Paketin kurulu olup olmadığını, kurulup kurulmadığını kontrol eder. Daha sonra hangi dalda olursa olsun paketi yükler.


21

Bu çözüm, paket adlarının bir karakter vektörünü alır ve bunları yüklemeye çalışır veya yükleme başarısız olursa bunları yükler. Bunu requireyapmak için geri dönüş davranışına dayanır çünkü ...

require gerekli paketin mevcut olup olmadığını gösteren bir mantık döndürür

Bu nedenle, gerekli paketi yükleyip yükleyemediğimizi görebilir ve değilse, bağımlılıklarla yükleyebiliriz. Yüklemek istediğiniz paketlerin bir karakter vektörü verildiğinde ...

foo <- function(x){
  for( i in x ){
    #  require returns TRUE invisibly if it was able to load package
    if( ! require( i , character.only = TRUE ) ){
      #  If package was not able to be loaded then re-install
      install.packages( i , dependencies = TRUE )
      #  Load package after installing
      require( i , character.only = TRUE )
    }
  }
}

#  Then try/install packages...
foo( c("ggplot2" , "reshape2" , "data.table" ) )

Yükledikten requiresonra tekrar aramak istemez misiniz ?
krlmlr

@krlmlr Hayır, çünkü ififadenin değerlendirilebilmesi için requireöncelikle yan etkisi mevcutsa paketi yükleyen değerlendirme yapmalıdır !
Simon O'Hanlon

1
SimonO101: Sanırım krlmlr, if ifadesinde, çağrıdan sonra, install.packagesbu paketi yüklemeyeceği için anlamına geliyor. Ama (@krlmlr için) niyet bu kod parçasının sadece bir kez çağrılacak olduğundan şüpheleniyorum; Paketi her istediğinizde bunu yazmazsınız. Bunun yerine, bir kez önceden çalıştırırsınız ve ardından requiregerektiği gibi her zaman ararsınız.
Aaron Stack Overflow'dan ayrıldı

@Aaron ah evet tamam, ne demek istediğini anlıyorum ve evet yorumun doğru. Yükledikten sonra yükleme konusunda daha açık olmak için biraz düzenleyeceğim.
Simon O'Hanlon

1
ikincisi requirebir çağrı yapmak daha iyi olmaz , libraryböylece paketi bir sebepten dolayı hala ekleyemiyorsa gürültülü bir şekilde başarısız olur mu?
kabdulla

18

Yukarıdaki cevapların çoğu (ve bu sorunun kopyalarında) installed.packageshangisinin kötü olduğuna güvenmektedir . Belgelerden:

Binlerce paket yüklendiğinde bu yavaş olabilir, bu nedenle adlandırılmış bir paketin kurulu olup olmadığını (system.file veya find.package kullanın) öğrenmek ya da bir paketin kullanılabilir olup olmadığını öğrenmek (arama gereksinimi ve kontrol etmek için) kullanmayın. dönüş değeri) veya az sayıda paketin ayrıntılarını bulmak için (packageDescription kullanın). Yüklü paket başına birkaç dosya okumalıdır, bu da Windows ve ağa bağlı bazı dosya sistemlerinde yavaş olacaktır.

Bu nedenle, paketi kullanarak requireve yüklemede başarısız olursa yükleme yapmaya çalışmak daha iyi bir yaklaşımdır ( bulunmazsa requiregeri dönecektir FALSE). Bu uygulamayı tercih ederim:

using<-function(...) {
    libs<-unlist(list(...))
    req<-unlist(lapply(libs,require,character.only=TRUE))
    need<-libs[req==FALSE]
    if(length(need)>0){ 
        install.packages(need)
        lapply(need,require,character.only=TRUE)
    }
}

Bu şekilde kullanılabilir:

using("RCurl","ggplot2","jsonlite","magrittr")

Bu şekilde tüm paketleri yükler, sonra geri döner ve tüm eksik paketleri yükler (isterseniz, kullanıcının paketleri yüklemek isteyip istemediğini sormak için kullanışlı bir yerdir). install.packagesHer paket için ayrı ayrı çağırmak yerine, kaldırılan paketlerin tüm vektörünü sadece bir kez geçirir.

İşte aynı işlev, ancak kullanıcının eksik paketleri yüklemek isteyip istemediğini soran bir pencere iletişim kutusu ile

using<-function(...) {
    libs<-unlist(list(...))
    req<-unlist(lapply(libs,require,character.only=TRUE))
    need<-libs[req==FALSE]
    n<-length(need)
    if(n>0){
        libsmsg<-if(n>2) paste(paste(need[1:(n-1)],collapse=", "),",",sep="") else need[1]
        print(libsmsg)
        if(n>1){
            libsmsg<-paste(libsmsg," and ", need[n],sep="")
        }
        libsmsg<-paste("The following packages could not be found: ",libsmsg,"\n\r\n\rInstall missing packages?",collapse="")
        if(winDialog(type = c("yesno"), libsmsg)=="YES"){       
            install.packages(need)
            lapply(need,require,character.only=TRUE)
        }
    }
}

Bu oldukça zarif bir yol, kabul edilenden çok daha iyi. Kişisel kütüphaneme ekleyeceğim. Teşekkürler.
Bing

15

Shane cevabı projemin biri için, gerçekten iyi olmasına rağmen ben çıkışına mesajları, uyarıları kaldırmak ve paketleri yüklemek için gereken automagicallylar . Sonunda bu komut dosyasını almayı başardım:

InstalledPackage <- function(package) 
{
    available <- suppressMessages(suppressWarnings(sapply(package, require, quietly = TRUE, character.only = TRUE, warn.conflicts = FALSE)))
    missing <- package[!available]
    if (length(missing) > 0) return(FALSE)
    return(TRUE)
}

CRANChoosen <- function()
{
    return(getOption("repos")["CRAN"] != "@CRAN@")
}

UsePackage <- function(package, defaultCRANmirror = "http://cran.at.r-project.org") 
{
    if(!InstalledPackage(package))
    {
        if(!CRANChoosen())
        {       
            chooseCRANmirror()
            if(!CRANChoosen())
            {
                options(repos = c(CRAN = defaultCRANmirror))
            }
        }

        suppressMessages(suppressWarnings(install.packages(package)))
        if(!InstalledPackage(package)) return(FALSE)
    }
    return(TRUE)
}

kullanın:

libraries <- c("ReadImages", "ggplot2")
for(library in libraries) 
{ 
    if(!UsePackage(library))
    {
        stop("Error!", library)
    }
}

9
# List of packages for session
.packages = c("ggplot2", "plyr", "rms")

# Install CRAN packages (if not already installed)
.inst <- .packages %in% installed.packages()
if(length(.packages[!.inst]) > 0) install.packages(.packages[!.inst])

# Load packages into session 
lapply(.packages, require, character.only=TRUE)

6

Rbundler paketinin amacı budur : belirli bir proje için kurulan paketleri kontrol etmek için bir yol sağlamak. Şu anda paket, projenizin dizinine paketleri yüklemek için devtools işlevselliği ile çalışmaktadır. İşlevi Ruby'nin paketleyicisine benzer .

Projeniz bir paketse (önerilen), tek yapmanız gereken rbundler yüklemek ve paketleri paketlemektir. bundleFonksiyon paketin bakacağız DESCRIPTIONpaket için hangi paketleri belirlemek için dosyanın.

library(rbundler)
bundle('.', repos="http://cran.us.r-project.org")

Şimdi paketler .Rbundle dizinine kurulacaktır.

Projeniz bir paket değilse, DESCRIPTIONyüklenmesini istediğiniz paketleri (isteğe bağlı sürüm bilgileriyle) listeleyen bir Bağımlılar alanı ile projenizin kök dizininde bir dosya oluşturarak sahte yapabilirsiniz :

Depends: ggplot2 (>= 0.9.2), arm, glmnet

İşte katkıda bulunmak istiyorsanız proje için github repo: rbundler .


5

Elbette.

'Kurulu paketleri' ile 'istenen paketleri' karşılaştırmanız gerekir. Yeni ve / veya güncellenmiş paketleri belirlemek için 'depolanmış bilinen paketleri' şu anda bilinen paketleri 'karşılaştırmam gerektiğinden , CRANberries ile yaptığım şeye çok yakın .

Yani böyle bir şey yap

AP <- available.packages(contrib.url(repos[i,"url"]))   # available t repos[i]

bilinen tüm paketleri almak için, şu anda yüklü paketler için benzetimli çağrı yapın ve verilen hedef paketlerle karşılaştırın.


5

Kullan packratpaylaşılan kütüphaneler tam olarak aynı ve diğer çevreyi değiştirmeme, böylece.

Zarafet ve en iyi uygulama açısından, temelde yanlış yolda olduğunuzu düşünüyorum. Paket packratbu sorunlar için tasarlanmıştır. Hadley Wickham tarafından RStudio tarafından geliştirilmiştir. Bağımlılıkları kurmak ve muhtemelen birinin çevre sistemini karıştırmak yerine, packratkendi dizinini kullanır ve programlarınız için tüm bağımlılıkları oraya yükler ve birinin ortamına dokunmaz.

Packrat, R için bir bağımlılık yönetim sistemidir.

R paket bağımlılıkları sinir bozucu olabilir. Hiç kimsenin kodunun çalışması için hangi R paketlerini yüklemeniz gerektiğini denemek için yan yana deneme yanılma yöntemini kullanmak zorunda kaldınız mı? ? Hiç projelerinizden birinde kod almak için bir paketi güncellediniz mi, sadece güncellenmiş paketin başka bir projedeki kodu çalışmayı durdurduğunu bulmak için?

Bu sorunları çözmek için packrat oluşturduk. R projelerinizi daha fazla yapmak için packrat kullanın:

  • Yalıtılmış: Bir proje için yeni veya güncellenmiş bir paket yüklemek, diğer projelerinizi bozmaz veya tam tersi. Çünkü packrat her projeye kendi özel paket kütüphanesini veriyor.
  • Taşınabilir: Farklı platformlarda bile projelerinizi bir bilgisayardan diğerine kolayca taşıyın. Packrat, projenizin bağlı olduğu paketleri kurmayı kolaylaştırır.
  • Tekrarlanabilir: Packrat, bağlı olduğunuz tam paket sürümlerini kaydeder ve bu kesin sürümlerin gittiğiniz her yere yüklenen sürümler olmasını sağlar.

https://rstudio.github.io/packrat/


4

Aşağıdaki basit işlev bir cazibe gibi çalışır:

  usePackage<-function(p){
      # load a package if installed, else load after installation.
      # Args:
      #   p: package name in quotes

      if (!is.element(p, installed.packages()[,1])){
        print(paste('Package:',p,'Not found, Installing Now...'))
        install.packages(p, dep = TRUE)}
      print(paste('Loading Package :',p))
      require(p, character.only = TRUE)  
    }

(benim değil, bunu bir süre önce web'de buldum ve o zamandan beri kullanıyordum. orijinal kaynaktan emin değilim)


4

require("<package>")Paket bulunamadı hatasıyla çıkarsa paketi yüklemek için aşağıdaki işlevi kullanıyorum . Eksik paket için hem CRAN hem de Bioiletken depolarını sorgulayacaktır.

Joshua Wiley'in orijinal çalışmasından uyarlanmış, http://r.789695.n4.nabble.com/Install-package-automatically-if-not-there-td2267532.html

install.packages.auto <- function(x) { 
  x <- as.character(substitute(x)) 
  if(isTRUE(x %in% .packages(all.available=TRUE))) { 
    eval(parse(text = sprintf("require(\"%s\")", x)))
  } else { 
    #update.packages(ask= FALSE) #update installed packages.
    eval(parse(text = sprintf("install.packages(\"%s\", dependencies = TRUE)", x)))
  }
  if(isTRUE(x %in% .packages(all.available=TRUE))) { 
    eval(parse(text = sprintf("require(\"%s\")", x)))
  } else {
    source("http://bioconductor.org/biocLite.R")
    #biocLite(character(), ask=FALSE) #update installed packages.
    eval(parse(text = sprintf("biocLite(\"%s\")", x)))
    eval(parse(text = sprintf("require(\"%s\")", x)))
  }
}

Misal:

install.packages.auto(qvalue) # from bioconductor
install.packages.auto(rNMF) # from CRAN

PS: update.packages(ask = FALSE)& biocLite(character(), ask=FALSE)sistemdeki yüklü tüm paketleri güncelleyecektir. Bu uzun zaman alabilir ve her zaman garanti edilmeyebilecek tam bir R yükseltmesi olarak düşünülebilir!


Paketlerin gerçekten vinç veya bc üzerinde avilable olup olmadığını kontrol ederek geliştirilebilir. Ayrıca yükleme başarısız olursa veya bir paket mevcut değilse hata atmak için sonunda kitaplığı kullanmalıdır. Adını verdiğim geliştirilmiş halini görmek loadpack()üzerinde raw.githubusercontent.com/holgerbrandl/datautils/master/R/...
Holger Brandl

4

setdiffYüklü olmayan paketleri almak ve sonra yüklemek için bu işlevi kullanabilirsiniz . Aşağıdaki örnekte, ggplot2ve Rcpppaketlerinin kurulmadan önce kurulu olup olmadığını kontrol ediyoruz .

unavailable <- setdiff(c("ggplot2", "Rcpp"), rownames(installed.packages()))
install.packages(unavailable)

Bir satırda, yukarıdaki gibi yazılabilir:

install.packages(setdiff(c("ggplot2", "Rcpp"), rownames(installed.packages())))

Aynı yaklaşımı kullanıyorum. installed.packages()[,'Package']Bunun yerine de kullanabiliriz rownames(installed.packages()).
Scudelletti

3

Gerekli R paketlerini sessizce kurma ve yükleme işlevini uyguladım. Umut yardımcı olabilir. İşte kod:

# Function to Install and Load R Packages
Install_And_Load <- function(Required_Packages)
{
    Remaining_Packages <- Required_Packages[!(Required_Packages %in% installed.packages()[,"Package"])];

    if(length(Remaining_Packages)) 
    {
        install.packages(Remaining_Packages);
    }
    for(package_name in Required_Packages)
    {
        library(package_name,character.only=TRUE,quietly=TRUE);
    }
}

# Specify the list of required packages to be installed and load    
Required_Packages=c("ggplot2", "Rcpp");

# Call the Function
Install_And_Load(Required_Packages);

3

Önizleme olarak zaten mevcut olan RStudio'nun (1.2) gelecek sürümü, eksik paketleri library()ve require()çağrıları tespit etmek ve kullanıcıdan bunları yüklemesini istemek için bir özellik içerecektir :

Eksik R paketlerini algılama

Birçok R komut dosyası yürütmek için ihtiyaç duydukları paketleri çağırmak library()ve require()yüklemek için açılır . Yüklemediğiniz paketlere başvuruda bulunan bir R komut dosyasını açarsanız, RStudio artık tüm gerekli paketleri tek bir tıklamayla yüklemeyi önerecektir. install.packages()Hatalar ortadan kalkana kadar tekrar tekrar yazmaya gerek yok !
https://blog.rstudio.com/2018/11/19/rstudio-1-2-preview-the-little-things/

Bu OP'nin asıl endişesini özellikle iyi ele alıyor gibi görünüyor:

Birçoğu acemi / orta düzeydeki R kullanıcılarıdır ve zaten sahip olmadıkları paketleri kurmaları gerektiğinin farkında değildir.


2

"Hedefi olmayan kütüphaneleri kurmak" gibi temel hedefiniz ve "instllaed.packages ()" kullanılmasına bakılmaksızın. Aşağıdaki işlev, orijinal işlev maskesini gerektirir. "X" adlı paketi yüklemeye ve kontrol etmeye çalışır, yüklü değilse doğrudan bağımlılıklar dahil olarak kurun; ve son olarak normal olarak yükleyin. bütünlüğü korumak için işlev adını 'zorunlu' olarak 'kütüphane' olarak yeniden adlandırırsınız. Tek sınırlama paket adlarının alıntılanmasıdır.

require <- function(x) { 
  if (!base::require(x, character.only = TRUE)) {
  install.packages(x, dep = TRUE) ; 
  base::require(x, character.only = TRUE)
  } 
}

Böylece yükleyebilir ve yükleyebilirsiniz paketi R eski moda yolu gerektirir ("ggplot2") gerektirir ("Rcpp")


Cevabınızı artık beğenmediyseniz, vandalize etmeyin - sadece silin.
Michael Petrotta

Denedim ama yapamadım. FF'nin NoScript uzantımın devre dışı bıraktığını düşünüyorum veya kendi cevabımı silme haklarına ve kredilerine sahip değilim. LoL Ancak, Livius'un maskeleme olmadan düşündüğüm yanıtı oldukça yakın olduğunu düşünüyorum. Teşekkürler Michael Petrotta. bildirim için.
GeoObserver

deleteBu yorumların üstünde bir bağlantı görmelisiniz . Yapmazsanız ve yine de silmek istiyorsanız flagbağlantıyı kullanın, "diğer" i seçin ve yanıtın kaldırılmasını istediğiniz bir moderatöre açıklayın.
Michael Petrotta

2

Oldukça basit olan.

pkgs = c("pacman","data.table")
if(length(new.pkgs <- setdiff(pkgs, rownames(installed.packages())))) install.packages(new.pkgs)

2

Kullandığım kişiye katkıda bulunacağımı düşündüm:

testin <- function(package){if (!package %in% installed.packages())    
install.packages(package)}
testin("packagename")

2
source("https://bioconductor.org/biocLite.R")
if (!require("ggsci")) biocLite("ggsci")

2

Laponya ailesi ve anonim işlev yaklaşımını kullanarak şunları yapabilirsiniz:

  1. Listelenen tüm paketleri eklemeyi deneyin.
  2. Yalnızca eksik yükleyin ( ||tembel değerlendirme kullanarak ).
  3. Adım 1'de eksik olan ve adım 2'de kurulanları tekrar takmaya çalışın.
  4. Her paketin son yükleme durumunu ( TRUE/ FALSE) yazdırın .

    req <- substitute(require(x, character.only = TRUE))
    lbs <- c("plyr", "psych", "tm")
    sapply(lbs, function(x) eval(req) || {install.packages(x); eval(req)})
    
    plyr psych    tm 
    TRUE  TRUE  TRUE 

1

Paketin yüklü olup olmadığını ve bağımlılıkların güncellenip güncellenmediğini kontrol edecek aşağıdakileri kullanıyorum, sonra paketi yükler.

p<-c('ggplot2','Rcpp')
install_package<-function(pack)
{if(!(pack %in% row.names(installed.packages())))
{
  update.packages(ask=F)
  install.packages(pack,dependencies=T)
}
 require(pack,character.only=TRUE)
}
for(pack in p) {install_package(pack)}

completeFun <- function(data, desiredCols) {
  completeVec <- complete.cases(data[, desiredCols])
  return(data[completeVec, ])
}

1

İşte bunun için benim kod:

packages <- c("dplyr", "gridBase", "gridExtra")
package_loader <- function(x){
    for (i in 1:length(x)){
        if (!identical((x[i], installed.packages()[x[i],1])){
            install.packages(x[i], dep = TRUE)
        } else {
            require(x[i], character.only = TRUE)
        }
    }
}
package_loader(packages)

1
 48 lapply_install_and_load <- function (package1, ...)
 49 {
 50     #
 51     # convert arguments to vector
 52     #
 53     packages <- c(package1, ...)
 54     #
 55     # check if loaded and installed
 56     #
 57     loaded        <- packages %in% (.packages())
 58     names(loaded) <- packages
 59     #
 60     installed        <- packages %in% rownames(installed.packages())
 61     names(installed) <- packages
 62     #
 63     # start loop to determine if each package is installed
 64     #
 65     load_it <- function (p, loaded, installed)
 66     {
 67         if (loaded[p])
 68         {
 69             print(paste(p, "loaded"))
 70         }
 71         else
 72         {
 73             print(paste(p, "not loaded"))
 74             if (installed[p])
 75             {
 76                 print(paste(p, "installed"))
 77                 do.call("library", list(p))
 78             }
 79             else
 80             {
 81                 print(paste(p, "not installed"))
 82                 install.packages(p)
 83                 do.call("library", list(p))
 84             }
 85         }
 86     }
 87     #
 88     lapply(packages, load_it, loaded, installed)
 89 }

1
library <- function(x){
  x = toString(substitute(x))
if(!require(x,character.only=TRUE)){
  install.packages(x)
  base::library(x,character.only=TRUE)
}}

Bu, sıralanmamış paket adları ile çalışır ve oldukça zariftir (bkz. GeoObserver cevabı)


1

Benim durumumda, komut satırından (aslında bir Makefile aracılığıyla) çalıştırabileceğim bir astar istedim. Zaten yüklü değilse "VGAM" ve "feather" i yükleyen bir örnek:

R -e 'for (p in c("VGAM", "feather")) if (!require(p, character.only=TRUE)) install.packages(p, repos="http://cran.us.r-project.org")'

R içinden sadece şöyle olurdu:

for (p in c("VGAM", "feather")) if (!require(p, character.only=TRUE)) install.packages(p, repos="http://cran.us.r-project.org")

Burada önceki çözümlerin ötesinde hiçbir şey yoktur:

  • Tek bir çizgide tutuyorum
  • reposParametreyi sabit kodluyorum (kullanılacak ayna hakkında soran pop-up'ları önlemek için)
  • Başka bir yerde kullanılacak bir işlevi tanımlamak için zahmet etmiyorum

Ayrıca önemli olanlara dikkat edin character.only=TRUE(onsuz require, paketi yüklemeye çalışır p).


0
  packages_installed <- function(pkg_list){
        pkgs <- unlist(pkg_list)
        req <- unlist(lapply(pkgs, require, character.only = TRUE))
        not_installed <- pkgs[req == FALSE]
        lapply(not_installed, install.packages, 
               repos = "http://cran.r-project.org")# add lib.loc if needed
        lapply(pkgs, library, character.only = TRUE)
}

0

Biraz deliliği paylaşmama izin verin:

c("ggplot2","ggsci", "hrbrthemes", "gghighlight", "dplyr") %>%  # What will you need to load for this script?
  (function (x) ifelse(t =!(x %in% installed.packages()), 
    install.packages(x[t]),
    lapply(x, require))) 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.