โหลดหลายแพ็คเกจพร้อมกัน


174

ฉันจะโหลดแพ็กเกจจำนวนมากพร้อมกันโดยไม่ต้องพิมพ์คำสั่ง need ซ้ำแล้วซ้ำอีกได้อย่างไร? ฉันได้ลองสามวิธีซึ่งทั้งหมดนี้พังและเผา

โดยทั่วไปฉันต้องการระบุเวกเตอร์ของชื่อแพ็คเกจให้กับฟังก์ชันที่จะโหลด

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

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

คำตอบ:


251

การเรียงสับเปลี่ยนของฟังก์ชั่นที่คุณเสนอจะใช้งานได้ แต่ถ้าคุณระบุcharacter.onlyอาร์กิวเมนต์ที่TRUEต้องการ ตัวอย่างด่วน:

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

@Tommy & daroczig - ยอดเยี่ยม นั่นเป็นวิธีแก้ปัญหาที่ไกลกว่า ฉันจะทิ้งฉันไว้สำหรับลูกหลานและสิ่งที่มันแสดงให้เห็นว่าทำไมความพยายามของ OP ถึงไม่ทำงาน
Josh O'Brien

4
คุณสามารถใช้ประโยชน์จากการจับคู่อักขระบางส่วนและหลบเลี่ยง (x, ต้องการ, ch = T) หรือแม้แต่ lapply (x, ต้องการ, c = T)
Dason

@daroczig รหัสนี้โหลดแพคเกจ แต่ทำไมมันให้ข้อความเตือนต่อไปนี้: 1: ในห้องสมุด (แพคเกจ, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE: ไม่มีแพคเกจที่เรียกว่า 'x' 2: ในกรณีที่ (โหลด!) {: เงื่อนไขมีความยาว> 1 และจะใช้องค์ประกอบแรกเท่านั้น
Anusha

@Anusha: ฉันไม่รู้ว่า ATM คุณมีอะไรในตัวคุณxบ้าง
daroczig

23
จะดีถ้า R :: ฐานเพิ่มนี้เคล็ดลับพื้นเมืองlapply library()เป็นคนที่ดีที่จะพูดได้:library(c("plyr", "umx"))
ทิม

58

Pacmanแพ็กเกจ CRAN ที่ฉันดูแล (เขียนโดย Dason Kurkiewicz) สามารถทำสิ่งนี้ได้:

ดังนั้นผู้ใช้สามารถทำได้:

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

และหากแพ็คเกจที่ขาดหายไปp_loadจะดาวน์โหลดจาก CRAN หรือ Bioconductor


7
+1! ทำไมคุณถึงเลือกชื่อสั้น ๆ ว่าทำไมp_load? ชื่อที่เป็นคำอธิบายเพิ่มเติมเช่นload_packagesทำให้เจตนาของฟังก์ชันชัดเจนขึ้น
Paul Hiemstra

19
เพราะ p ย่อมาจากแพ็คเกจ p_ทุกฟังก์ชั่นในแพคเกจที่จะเริ่มต้นที่มีประโยชน์และส่งออกด้วย นอกจากนี้เรามักจะใช้ไลบรารี่สักหน่อยและนั่นคืออีก 7 ตัวอักษร 7 ตัวอักษร x ~ 1000000 อายุการใช้งานของฟังก์ชั่น x .5 วินาทีต่อตัวอักษร = 3500000 วินาที นั่นคือ 58333.33 นาที, 972.2222 ชั่วโมงหรือ 40.50926 วันในชีวิตของโปรแกรมเมอร์ที่เราได้มอบกลับมาให้พวกเขา :-) ในกรณีใด ๆ เป้าหมายของเราคือการผลักดันให้ CRAN ภายในวันที่ 1 ก.พ.
Tyler Rinker

3
ประมาณปลายปี แต่ในที่สุดเราก็ส่ง CRAN ควรจะขึ้นในไม่กี่วัน @trinker (หรือฉัน) ตรวจสอบให้แน่ใจว่าได้แก้ไขสิ่งนี้เมื่อมันเผยแพร่สู่สาธารณะ
Dason

5
@ ไทเลอร์ฉันรู้ว่าฉันปีที่ผ่านมา แต่ฉันพบว่าเหตุผลของคุณสำหรับp_คำนำหน้าค่อนข้างน่าสงสัย หากปัญหาคือความตึงให้นำp_หน้าทั้งหมดออก ในความเป็นจริงการมีคำนำหน้าดังกล่าวมักจะทำให้หมดกำลังใจในภาษาอื่นด้วยเหตุผลที่ดี (ฉันบอกfct_แฮดลี่ย์ว่าพวกเขาเหมือนกันเกี่ยวกับเรื่องไร้สาระของเขาในการละทิ้ง) สิ่งนี้เป็นจริงโดยเฉพาะอย่างยิ่งเนื่องจากการใช้งานแพคเกจ th อยู่กับเนมสเปซที่ผ่านการรับรอง ( pacman::)
Konrad Rudolph

5
@TylerRinker ขอโทษสำหรับการต่อสู้กับปัญหานี้ แต่ฉันคิดว่าชุมชน R เป็นความผิดที่นี่และแทบทุกภาษาสมัยใหม่อื่น ๆ ทำให้ถูกต้อง: คุณพูดว่า "ยามนี้ต่อต้านความขัดแย้งของ namespace" - แต่นี่คือสิ่งที่ namespaces สำหรับ! ความรับผิดชอบของนักเขียนแพ็กเกจคือการให้ความรู้แก่ผู้คนในการใช้งานแพ็คเกจอย่างเหมาะสม
Konrad Rudolph

24

สิ่งนี้ควรทำเคล็ดลับ:

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

(บิตที่สำคัญคือการargsโต้แย้งในdo.call(what, args) จะต้องเป็นรายการ --- แม้ว่ามันจะมีเพียงองค์ประกอบเดียว!)


16

สำหรับคนที่ต้องการติดตั้งและโหลดแพ็คเกจพร้อมกันฉันเจอฟังก์ชั่นนี้จากลิงค์นี้

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

สวัสดีฉันสร้างไฟล์ R จากตัวอย่างที่คุณให้ไว้ เมื่อฉันเรียกใช้สคริปต์นั้นในบริการ Amazon EMR จะให้ผลลัพธ์ต่อไปนี้ตามที่ระบุใน URL ต่อไปนี้ pastie.org/10402378#3,10-11,13
Rubin Porwal

9

easypackagesตัวเลือกทางเลือกมาจากแพคเกจ เมื่อติดตั้งแล้วคุณสามารถโหลดแพ็คเกจด้วยวิธีที่ง่ายที่สุด:

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

แพคเกจนี้ยังมีฟังก์ชั่นในการติดตั้งหลายแพ็คเกจ

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

อ้างอิงที่นี่


ชื่อฟังก์ชั่นค่อนข้างสับสน / สับสน “ห้องสมุด” ในlibraryฟังก์ชั่นหมายถึงสถานที่ที่มีการติดตั้งแพคเกจที่: ห้องสมุดแพคเกจ การโหลดแพ็คเกจหลายรายการผ่านทางlibrariesไม่สมเหตุสมผล การมีฟังก์ชั่นแยกต่างหากpackagesที่ทำอย่างอื่นนั้นทำให้แย่ลง ฉันรู้ว่าการตั้งชื่อเป็นปัญหาที่ยากในวิศวกรรมซอฟต์แวร์ แต่จริงๆแล้ว ชื่อเหล่านี้แย่มาก
Konrad Rudolph

2
@ KonradRudolph ฉันไม่เห็นด้วยที่ชื่อlibrariesไม่สมเหตุสมผล มันเป็นพหูพจน์ของlibraryและlibraryโหลดแพคเกจเดียว; librariesโหลดแพ็คเกจจำนวนมาก หากคุณคิดว่าlibraryเป็นความหมาย "โหลดจากไลบรารีเดียวของคุณ" และขยายไปสู่librariesความหมายว่า "โหลดจากหลายไลบรารี" แสดงว่าอาจไม่ได้ใช้งานง่าย แต่นั่นไม่ใช่เจตนา librariesฉันจะมีความสุขมากที่มีชื่อ
Jamie S

@JamieS แต่ก็ยังโหลด (จากปกติ) จากไลบรารีเดียว ดูเหมือนว่าคุณจะสับสนระหว่างไลบรารีและแพ็คเกจ (ซึ่งค่อนข้างยุติธรรมได้กลายเป็นเรื่องธรรมดาใน R):“ ไลบรารี R” ตามที่ความคิดเห็นก่อนหน้านี้ของฉันระบุไว้อ้างถึงตำแหน่งที่ตั้ง (ไดเรกทอรี / ไดเรกทอรี) ที่ติดตั้งแพ็คเกจ R . ในตัวอย่างคำตอบนี้“ plyr”,“ psych” และ“ tm” ไม่ใช่ไลบรารี่: เป็นแพ็กเกจ
Konrad Rudolph

4

คุณสามารถใช้แพ็คเกจ lubripack และติดตั้งแพ็กเกจใหม่อย่างเรียบร้อยแล้วโหลดทั้งหมดในบรรทัดเดียว

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

นี่คือผลลัพธ์หลังจากคุณเรียกใช้โค้ดข้างต้นใน RStudio

ป้อนคำอธิบายรูปภาพที่นี่

วิธีการติดตั้งแพ็คเกจ:

เรียกใช้รหัสด้านล่างเพื่อดาวน์โหลดแพคเกจและติดตั้งจาก GitHub ไม่จำเป็นต้องมีบัญชี GitHub

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

5
ฉันเดาว่าจะใช้รูปภาพแทนข้อความ
The Unfun Cat

3
สิ่งนี้ยังไม่ตอบคำถามในวิธีที่ยังไม่ได้ตอบและดูเหมือนว่าส่วนใหญ่เป็นการส่งเสริมตนเอง
Tyler Rinker

คุณพูดถูกฉันพยายามตอบคำถามโดยปริยาย ช่วยทำให้ชัดเจนหวังว่าจะสามารถตอบคำถามได้
Espanta

@TylerRinker ตอนนี้เป็นอย่างไรบ้าง?
Espanta

3

การสร้างโซลูชันของ daroczig ถ้าคุณไม่ต้องการระบุรายการเป็นอินพุตคุณสามารถใช้ได้

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

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

... ซึ่งสั้นกว่า

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

2

ฉันใช้ฟังก์ชั่นต่อไปนี้:

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

สิ่งนี้จะพยายามโหลดและหากติดตั้งไม่สำเร็จและลองโหลดอีกครั้ง


2

ฉันคิดว่ารหัสที่ @daroczig ให้ไว้นั้นสามารถปรับปรุงได้ด้วยการแทนที่requireด้วยlibraryและล้อมlapplyสายภายในinvisible()ฟังก์ชั่น ดังนั้นรหัสที่ได้รับการปรับปรุงจะมีลักษณะดังนี้:

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

รหัสนี้ได้รับการปรับปรุงเนื่องจาก:

  1. library()โดยทั่วไปแล้วจะต้องการมากกว่าrequire()สำหรับการโหลดแพคเกจเพราะอดีตให้ข้อผิดพลาดหากไม่ได้ติดตั้งแพคเกจในขณะที่หลังเพียงแค่ให้คำเตือน ยิ่งไปกว่านั้นการrequire()โทรlibrary()ดังนั้นทำไมไม่ใช้เพียงlibrary()โดยตรง!

    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()โทรไม่มีความหมายในกรณีนี้ดังนั้นจึงเหมาะสมที่จะทำให้การมองไม่เห็นผลลัพธ์ สมมติว่าคุณใช้ R Notebook สำหรับงานวิเคราะห์ของคุณการใช้invisible()ฟังก์ชั่นจะระงับเนื้อหาของรายการวัตถุและป้องกันความยุ่งเหยิงในไฟล์สมุดบันทึกที่แสดงผล


1

คำตอบของ Tyler Rinker เล็กน้อยเพื่อเพิ่มการตรวจสอบการติดตั้งและโหลด pacman:

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

ฉันชอบโซลูชัน p_load เพราะหลีกเลี่ยงการอ้างอิง!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.