Muat banyak paket sekaligus

174

Bagaimana saya bisa memuat banyak paket sekaligus tanpa mengetik ulang perintah yang diperlukan berulang kali? Saya sudah mencoba tiga pendekatan yang semuanya crash dan burn.

Pada dasarnya, saya ingin menyediakan vektor nama paket ke fungsi yang akan memuatnya.

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

require(x)
lapply(x, require)
do.call("require", x)
Tyler Rinker
sumber

Jawaban:

251

Beberapa permutasi dari fungsi yang Anda usulkan berfungsi - tetapi hanya jika Anda menentukan character.onlyargumennya TRUE. Contoh cepat:

lapply(x, require, character.only = TRUE)
daroczig
sumber
@Tommy & daroczig - Cool. Itu solusi yang jauh lebih bersih. Saya akan menyerahkan milik saya hanya untuk anak cucu, dan untuk apa yang ditunjukkannya mengapa upaya OP tidak berhasil.
Josh O'Brien
4
Anda dapat mengambil keuntungan dari pencocokan karakter parsial dan lolos dengan lapply (x, membutuhkan, ch = T) atau bahkan lapply (x, membutuhkan, c = T)
Dason
@daroczig Kode ini memuat paket tetapi mengapa ia memberikan pesan peringatan berikut: 1: Di perpustakaan (paket, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE,: tidak ada paket yang dipanggil 'x' 2: In if (! loaded) {: kondisinya memiliki panjang> 1 dan hanya elemen pertama yang akan digunakan
Anusha
@Anusha: Saya tidak tahu ATM, apa yang Anda miliki di rumah Anda x?
daroczig
23
Jadilah baik jika R :: base menambahkan lapplytrik ini ke asli library(). Jadilah yang hebat untuk bisa mengatakan:library(c("plyr", "umx"))
tim
58

Pacman paket CRAN yang saya pertahankan (ditulis dengan Dason Kurkiewicz) dapat mencapai ini:

Jadi pengguna dapat melakukan:

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

dan jika paket tersebut hilang p_loadakan mengunduhnya dari CRAN atau Bioconductor.

Tyler Rinker
sumber
7
+1! Mengapa Anda memilih nama pendek p_load? Nama yang lebih deskriptif seperti load_packagesmembuat maksud fungsi lebih jelas.
Paul Hiemstra
19
Karena p adalah singkatan dari paket. Setiap fungsi dalam paket yang bermanfaat dan diekspor dimulai dengan p_. Ditambah lagi, kita cenderung menggunakan perpustakaan sedikit dan itu 7 karakter tambahan. 7 karakter x ~ 10.00000 penggunaan seumur hidup dari fungsi x 0,5 detik per karakter = 3500000 detik. Itu adalah 58333,33 menit, 972.2222 jam atau 40.50926 hari kehidupan seorang programmer yang telah kami berikan kembali kepada mereka :-) Bagaimanapun tujuan kami adalah mendorong ke CRAN pada 1 Februari
Tyler Rinker
3
Sekitar satu tahun terlambat tetapi kami akhirnya mengajukan ke CRAN. Harus bangun dalam beberapa hari. @trinker (atau saya) pastikan untuk memodifikasi ini setelah go public.
Dason
5
@ Tyler Saya tahu saya terlambat beberapa tahun tetapi saya menemukan alasan Anda untuk p_awalan agak meragukan. Jika terseness adalah masalah, hapus p_awalan sepenuhnya. Bahkan, memiliki awalan seperti itu umumnya tidak disarankan dalam bahasa lain untuk alasan yang baik (saya sudah memberi tahu Hadley bahwa mereka sama dengan fct_omong kosongnya dalam forcats). Ini terutama benar karena tujuan penggunaan paket th adalah dengan namespace yang memenuhi syarat ( pacman::).
Konrad Rudolph
5
@TylerRinker Meminta maaf karena bersikap agresif terhadap masalah ini, tapi saya benar-benar berpikir bahwa komunitas R benar-benar salah di sini, dan hampir setiap bahasa modern lainnya benar: Anda mengatakan "Ini penjaga terhadap konflik namespace." - Tapi inilah gunanya ruang nama! Tanggung jawab pada penulis paket adalah untuk mendidik orang untuk menggunakan paket dengan benar, bukan untuk mengakomodasi praktik pemrograman ceroboh mereka.
Konrad Rudolph
24

Ini harus melakukan trik:

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

(Kuncinya adalah argsargumen di do.call(what, args) harus berupa daftar --- walaupun hanya memiliki satu elemen!)

Josh O'Brien
sumber
16

Untuk seseorang yang ingin menginstal dan memuat paket secara bersamaan, saya menemukan fungsi ini dari tautan ini

# 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)
bala
sumber
Halo Saya membuat file R dari cuplikan Anda. Ketika saya menjalankan skrip di layanan EMR Amazon itu memberi saya output berikut sebagaimana ditentukan dalam URL berikut. pastie.org/10402378#3,10-11,13 .
Rubin Porwal
9

Opsi alternatif berasal dari paket easypackages. Setelah diinstal, Anda dapat memuat paket dengan cara yang paling intuitif:

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

Paket ini juga mencakup fungsi untuk menginstal beberapa paket:

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

Referensi di sini .

luchonacho
sumber
Nama fungsi agak membingungkan / membingungkan. "Perpustakaan", dalam libraryfungsi, merujuk ke lokasi di mana paket diinstal: perpustakaan paket . Memuat beberapa paket via librariestidak masuk akal. Memiliki fungsi terpisah packagesyang melakukan sesuatu yang lain hanya membuat ini lebih buruk. Saya tahu penamaan adalah masalah yang sulit dalam rekayasa perangkat lunak tetapi sebenarnya. Nama-nama ini sangat buruk.
Konrad Rudolph
2
@KonradRudolph Saya tidak setuju bahwa nama itu librariestidak masuk akal. Ini jamak library, dan librarymemuat satu paket; librariesmemuat sejumlah paket. Jika Anda menganggapnya librarysebagai "memuat dari perpustakaan Anda", dan memperluasnya menjadi libraries"memuat dari berbagai perpustakaan", maka itu mungkin tidak intuitif, tapi itu bukan maksudnya; Saya akan cukup senang dengan namanya libraries.
Jamie S
@ JamieS Tapi masih (biasanya) memuat dari satu perpustakaan. Anda tampaknya membingungkan perpustakaan dan paket (yang, untuk menjadi adil, telah menjadi umum di R): "R perpustakaan", seperti komentar saya sebelumnya, merujuk ke lokasi (direktori / direktori) di mana paket R diinstal . Dalam contoh jawaban ini, "plyr", "psych" dan "tm" bukan perpustakaan: itu adalah paket.
Konrad Rudolph
4

Anda cukup menggunakan paket lubripack dan menginstal paket baru dengan rapi lalu memuat semuanya dalam satu baris.

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

Ini adalah output setelah Anda menjalankan kode di atas di RStudio.

masukkan deskripsi gambar di sini

Cara Memasang Paket:

Jalankan kode di bawah ini untuk mengunduh paket dan menginstalnya dari GitHub. Tidak perlu memiliki Akun GitHub.

library(devtools)
install_github("espanta/lubripack")
Espanta
sumber
5
Saya kira menggunakan gambar alih-alih teks
The Unfun Cat
3
Ini juga tidak menjawab pertanyaan dengan cara yang belum dijawab dan tampaknya sebagian besar promosi diri.
Tyler Rinker
Anda benar, saya mencoba menjawab pertanyaan itu secara implisit. Mari kita membuatnya eksplisit berharap itu bisa menjadi jawaban untuk pertanyaan.
Espanta
@ TylerRinker Bagaimana itu sekarang?
Espanta
3

Membangun solusi daroczig, jika Anda tidak ingin menentukan daftar sebagai input yang dapat Anda gunakan

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

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

... yang lebih pendek dari

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

Saya menggunakan fungsi berikut:

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)
}

Ini mencoba memuat, dan jika gagal menginstal dan kemudian mencoba memuat lagi.

Ricardo
sumber
2

Saya pikir kode yang telah disediakan @daroczig dapat ditingkatkan dengan mengganti requiredengan librarydan membungkus lapplypanggilan di dalam invisible()fungsi. Jadi, kode yang ditingkatkan akan terlihat seperti berikut:

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

Kode ini ditingkatkan karena:

  1. library()umumnya lebih disukai daripada require()untuk memuat paket karena yang pertama memberikan kesalahan jika paket tidak diinstal sementara yang terakhir hanya memberikan peringatan. Apalagi require()panggilan library(), kenapa tidak library()langsung pakai saja !

    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. Objek daftar dikembalikan dan dicetak oleh lapply()panggilan tidak berarti dalam kasus ini, jadi masuk akal untuk membuat output tidak terlihat. Katakanlah Anda menggunakan R Notebook untuk pekerjaan analisis Anda, menggunakan invisible()fungsi akan menekan isi objek daftar dan mencegah kekacauan dalam file notebook yang diberikan.

Ashirwad
sumber
1

Mod sedikit dari jawaban Tyler Rinker untuk menambahkan tanda centang untuk menginstal & memuat pacman:

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

Saya suka solusi p_load karena menghindari mengutip!

mattador
sumber