Tek seferde birden fazla paket yükleyin


174

Requir komutunu tekrar tekrar yazmadan bir sürü paketi bir kerede nasıl yükleyebilirim? Çökme ve yanma gibi üç yaklaşımı denedim.

Temel olarak, onları yükleyecek bir fonksiyona paket isimleri vektörü sağlamak istiyorum.

x<-c("plyr", "psych", "tm")

require(x)
lapply(x, require)
do.call("require", x)

Yanıtlar:


251

Önerilen işlevlerinizin birkaç permütasyonu işe yarar - ancak yalnızca character.onlyargümanı belirtmeniz halinde TRUE. Hızlı örnek:

lapply(x, require, character.only = TRUE)

@Tommy & daroczig - Güzel. Bu çok daha temiz bir çözüm. Benimkini yalnızca gelecek nesiller için ve OP'nin girişimlerinin neden işe yaramadığına dair gösterdiği şey için bırakacağım.
Josh O'Brien

4
Kısmi karakter eşleşmesinden yararlanabilir ve lapply (x, zorunlu, ch = T) veya hatta lapply (x, zorunlu, c = T) ile kaçabilirsiniz
Dason

@daroczig Bu kod paketleri yükler, ancak neden aşağıdaki Uyarı iletilerini verir: 1: Kitaplıkta (paket, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE,: adlı paket yok 'x' 2: Eğer (! yüklenmiş) {: koşulun uzunluğu> 1 ise ve sadece ilk eleman kullanılır
Anusha

@Anusha: Hiçbir fikrim yok ATM, içinde ne var x?
daroczig

23
R :: base bu lapplynumarayı yerel olarak eklediyse iyi olun library(). Söylemek harika:library(c("plyr", "umx"))
tim

58

(Dason Kurkiewicz ile yazılan) sürdürdüğüm CRAN paketi pacman bunu başarabilir:

Böylece kullanıcı şunları yapabilir:

## install.packages("pacman")
pacman::p_load(dplyr, psych, tm) 

ve paket eksikse p_loadCRAN veya Bioconductor'dan indirir.


7
1! Neden kısa adı seçtiniz p_load? Gibi daha açıklayıcı bir isim load_packagesfonksiyonun amacını daha açık hale getirir.
Paul Hiemstra

19
Çünkü p paket anlamına gelir. Kullanışlı ve dışa aktarılan paketteki her işlev ile başlar p_. Ayrıca kütüphaneyi biraz kullanma eğilimindeyiz ve bu da 7 karakter daha. 7 karakter x ~ 1000000 ömür boyu kullanım işlevi karakter başına x .5 saniye = 3500000 saniye. Bu 58333.33 dakika, 972.2222 saat ya da 40.50926 günlük bir programcının hayatına geri verdik :-) Her durumda hedefimiz 1 Şubat'a kadar CRAN'a zorlamaktır
Tyler Rinker

3
Yaklaşık bir yıl geç kaldı ama sonunda CRAN'a başvurduk. Birkaç gün içinde olmalı. @trinker (veya ben), herkese açık hale geldiğinde bunu değiştirdiğinizden emin olun.
Dason

5
@Tyler Yıllar geç kaldığımı biliyorum ama p_önek için mantıklılığınızı oldukça şüpheli buluyorum . Sorun söz konusuysa, p_öneki tamamen kaldırın . Aslında, bu tür öneklere sahip olmak genellikle diğer nedenlerden dolayı iyi nedenlerden dolayı cesaretini kırmıştır (Hadley'e fct_forcats'taki saçmalıkları konusunda aynı olduklarını söyledim ). Bu özellikle doğrudur, çünkü bu paketin kullanım amacı nitelikli bir ad alanına ( pacman::) sahiptir.
Konrad Rudolph

5
@TylerRinker Bu konuda savaştığı için özür dilerim, ama R topluluğunun burada yanlış olduğunu ve hemen hemen her modern dilin doğru olduğunu düşünüyorum: “Bu, ad alanı çatışmalarına karşı koruma sağlıyor” diyorsunuz. - Ama isim alanları bunun için! Paket yazarları hakkında bilgi, insanları özensiz programlama uygulamalarına uymak için değil, paketleri düzgün kullanmaları için eğitmektir.
Konrad Rudolph

24

Bu hile yapmalı:

lapply(x, FUN = function(X) {
    do.call("require", list(X)) 
})

(Anahtar bit, yalnızca tek bir öğeye sahip olsa bile , içindeki argsbağımsız değişkenin bir liste do.call(what, args) olması gerektiğidir!)


16

Paketleri aynı anda kurmak ve yüklemek isteyen biri için bu fonksiyondan bu linkle karşılaştım

# ipak function: install and load multiple R packages.
# check to see if packages are installed. Install them if they are not, then load them into the R session.

ipak <- function(pkg){
new.pkg <- pkg[!(pkg %in% installed.packages()[, "Package"])]
if (length(new.pkg)) 
    install.packages(new.pkg, dependencies = TRUE)
sapply(pkg, require, character.only = TRUE)
}

# usage
packages <- c("ggplot2", "plyr", "reshape2", "RColorBrewer", "scales", "grid")
ipak(packages)

Merhaba Belirttiğiniz snippet'inizden bir R dosyası oluşturdum. Bu komut dosyasını Amazon EMR hizmetinde çalıştırdığımda, aşağıdaki URL'de belirtildiği gibi bana aşağıdaki çıktıyı veriyor. pastie.org/10402378#3,10-11,13 .
Rubin Porwal

9

Alternatif bir seçenek paketten geliyor easypackages. Kurulduktan sonra, paketleri en sezgisel bir şekilde yükleyebilirsiniz:

libraries("plyr", "psych", "tm")

Paket ayrıca birkaç paket yüklemek için bir işlev içerir:

packages("plyr", "psych", "tm")

Burada referans .


İşlev adı oldukça karışık / karışık. İşlevdeki “kütüphane”, librarypaketlerin kurulu olduğu konumu ifade eder: paket kütüphanesi . Birden fazla paketin yüklenmesi librariesmantıklı değil. packagesBaşka bir şey yapan ayrı bir işleve sahip olmak bunu daha da kötüleştirir. İsimlendirmenin yazılım mühendisliğinde zor bir sorun olduğunu biliyorum ama gerçekten. Bu isimler özellikle kötü.
Konrad Rudolph

2
@KonradRudolph Adın bir librariesanlamı olmadığını kabul etmiyorum . Tek bir paketin çoğuludur libraryve libraryyüklenir; librariesçok sayıda paket yükler. Eğer düşünürseniz library"senin tek kütüphaneden yük" anlamında ve bu genişletmek libraries"Birden çok kütüphanelerden yük" anlamına gelen, o zaman belki unintuitive, ama bu niyet değil; Bu isimden oldukça memnun olurum libraries.
Jamie S

@JamieS Ama yine de (genellikle) tek bir kütüphaneden yükleniyor. Kütüphane ve paketi karıştırıyorsunuz (ki bu adil olmak gerekirse R'de yaygınlaştı): “R kütüphanesi”, önceki yorumumda belirtildiği gibi, R paketlerinin kurulu olduğu konum (lar) ı (dizin / dizinler) ifade eder . Bu yanıtın örneğinde, “plyr”, “psych” ve “tm” kütüphaneler değil : paketlerdir.
Konrad Rudolph

4

Sadece lubripack paketini kullanabilirsiniz ve yeni paketleri düzgün bir şekilde kurar ve ardından hepsini tek bir satıra yükler.

lubripack("plyr", "psych", "tm")

RStudio'da kodun üzerinde çalıştıktan sonra çıktı.

resim açıklamasını buraya girin

Paket Nasıl Kurulur:

Paketi indirmek ve GitHub'dan yüklemek için aşağıdaki kodu çalıştırın. GitHub Hesabına gerek yok.

library(devtools)
install_github("espanta/lubripack")

5
Metin yerine görüntüleri kullanarak tahmin ediyorum
Unfun Cat

3
Bu aynı zamanda soruyu daha önce cevaplanmamış bir şekilde cevaplamamaktadır ve çoğunlukla kendi kendini tanıtmak gibi görünmektedir.
Tyler Rinker

Haklısın, soruyu dolaylı olarak cevaplamaya çalıştım. Soruyu cevaplayabileceğini ümit ederek onu açık yapalım.
Espanta

@TylerRinker Şimdi nasıl?
Espanta

3

Daroczig'in çözümüne dayanarak, girdi olarak bir liste belirtmek istemiyorsanız kullanabilirsiniz

# Foo
mLoad <- function(...) {
  sapply(sapply(match.call(), as.character)[-1], require, character.only = TRUE)
}

# Example 
mLoad(plyr, dplyr, data.table)

... ki bu daha kısa

lapply(list('plyr', 'dplyr', 'data.table'), require, character.only = TRUE)

2

Aşağıdaki işlevi kullanıyorum:

mrip <- function(..., install = TRUE){
    reqFun <- function(pack) {
        if(!suppressWarnings(suppressMessages(require(pack, character.only = TRUE)))) {
            message(paste0("unable to load package ", pack,
                           ": attempting to download & then load"))
            install.packages(pack)
            require(pack, character.only = TRUE)
        }
    }
    lapply(..., reqFun)
}

Bu yüklenmeye çalışır ve yükleme başarısız olursa yeniden yüklemeyi deneyin.


2

Ben @daroczig değiştirerek geliştirilebilir sağladığı kodu düşünmek requireile libraryve sarma lapplyiçi aramayı invisible()fonksiyonu. Böylece, geliştirilmiş kod aşağıdaki gibi görünecektir:

invisible(lapply(x, library, character.only = TRUE))

Bu kod geliştirildi çünkü:

  1. library()require()paketlerin yüklenmesi için genellikle tercih edilir, çünkü paket yüklenmezse ikincisi bir hata verirken ikincisi bir uyarı verir. Ayrıca, require()aramalar library(), neden sadece library()doğrudan kullanmak değil !

    library("time")
    # Error in library("time") : there is no package called ‘time’
    
    require("time")
    # Loading required package: time
    # Warning message:
    # In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE,  :
    # there is no package called ‘time’
  2. lapply()Çağrı tarafından döndürülen ve yazdırılan liste nesnesi bu durumda anlamlı değildir, bu nedenle çıktıyı görünmez yapmak mantıklıdır. Analiz çalışmanız için R Notebook kullandığınızı varsayalım, invisible()işlevi kullanmak liste nesnesinin içeriğini bastıracak ve işlenen defter dosyasındaki karışıklığı önleyecektir.


1

Pacman'ı kurmak ve yüklemek için bir kontrol eklemek için Tyler Rinker'in cevabının hafif modu:

#Install/load pacman
if(!require(pacman)){install.packages("pacman");require(pacman)}
#Install/load tons of packages
p_load(plyr,psych,tm)

Ben alıntı önler çünkü p_load çözüm seviyorum!

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.