एक साथ कई पैकेज लोड करें


174

मैं एक से अधिक पैकेज की आवश्यकता के साथ एक से अधिक बार लोड कैसे कर सकता हूं? मैंने तीन तरीकों की कोशिश की है जिनमें से सभी दुर्घटनाग्रस्त और जल गए हैं।

मूल रूप से, मैं एक फ़ंक्शन को पैकेज नामों के वेक्टर की आपूर्ति करना चाहता हूं जो उन्हें लोड करेगा।

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

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

जवाबों:


251

आपके प्रस्तावित कार्यों के कई क्रमांकन काम करते हैं - लेकिन केवल यदि आप character.onlyतर्क को निर्दिष्ट करते हैं TRUE। त्वरित उदाहरण:

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

@ टॉमी और डारोजिग - कूल। यह एक दूर क्लीनर समाधान है। मैं केवल पद के लिए, और ओपी के प्रयासों से काम नहीं करने के बारे में क्या दिखाता है, के लिए इसे छोड़ दूंगा।
जोश ओ'ब्रायन

4
आप आंशिक वर्ण मिलान का लाभ उठा सकते हैं और lapply (x, आवश्यकता, ch = T) या यहाँ तक कि lapply (x, आवश्यकता, c = T) के साथ दूर जा सकते हैं
दासन

@daroczig यह कोड पैकेजों को लोड करता है लेकिन यह निम्नलिखित चेतावनी संदेश क्यों देता है: 1: पुस्तकालय में (पैकेज, lib.loc = lib.loc, character.only = TRUE, तार्किक.return = TRUE:: कोई पैकेज नहीं है 'x' 2: यदि ((भरी हुई) {: स्थिति में लंबाई> 1 है और केवल पहले तत्व का उपयोग किया जाएगा
अनुशा

@ अनुषा: मुझे कुछ पता नहीं है, आपके पास क्या है x?
daroczig

23
अच्छा हो अगर आर :: बेस ने इस lapplyट्रिक को देशी जोड़ा library()। कहने में सक्षम होने के लिए महान बनें:library(c("plyr", "umx"))
टिम

58

CRAN पैकेज pacman कि मैं बनाए रखने के (Dason Kurkiewicz साथ लेखक) यह पूरा कर सकते हैं:

तो उपयोगकर्ता कर सकता है:

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

और यदि पैकेज गायब है, तो p_loadइसे CRAN या BioconSTR से डाउनलोड किया जाएगा।


7
+1! आपने छोटा नाम p_loadक्यों चुना? एक अधिक वर्णनात्मक नाम जैसे load_packagesकि फ़ंक्शन के इरादे को और अधिक स्पष्ट करता है।
पॉल हेमस्ट्रा

19
क्योंकि p पैकेज के लिए खड़ा है। पैकेज में प्रत्येक फ़ंक्शन जो उपयोगी है और निर्यात के साथ शुरू होता है p_। इसके अलावा, हम पुस्तकालय का उपयोग थोड़ा करते हैं और यह एक अतिरिक्त 7 अक्षर हैं। 7 वर्ण x ~ 1000000 जीवन काल फ़ंक्शन x .5 सेकंड प्रति वर्ण = 3500000 सेकंड का उपयोग करता है। 58333.33 मिनट, 972.2222 घंटे या एक प्रोग्रामर के जीवन के 40.50926 दिन हमने उन्हें वापस दिए हैं :-) किसी भी स्थिति में हमारा लक्ष्य 1 फरवरी तक क्रैन को धकेलना है
टायलर

3
लगभग एक साल की देरी से लेकिन हमने अंततः CRAN को प्रस्तुत किया। कुछ दिनों में ऊपर होना चाहिए। @trinker (या मुझे) सार्वजनिक होने के बाद इसे संशोधित करना सुनिश्चित करें।
डेसन

5
@ टायलर मुझे पता है कि मुझे कई साल हो गए हैं लेकिन मुझे p_उपसर्ग के लिए आपका औचित्य मिल गया है बल्कि संदिग्ध। यदि मरोड़ मुद्दा है, तो p_उपसर्ग को पूरी तरह से हटा दें । वास्तव में, इस तरह के उपसर्गों को आम तौर पर अच्छे कारणों के लिए अन्य भाषाओं में हतोत्साहित किया जाता है (मैंने हेडली से कहा था कि वे उसके बारे fct_में कांटों में अपनी बकवास के बारे में ही कहते हैं)। यह विशेष रूप से सच है क्योंकि वें पैकेज का उपयोग एक योग्य नाम स्थान ( pacman::) के साथ है।
कोनराड रुडोल्फ

5
@TylerRinker इस मुद्दे पर जुझारू होने के लिए क्षमा याचना करता है, लेकिन मुझे वास्तव में लगता है कि आर समुदाय बस यहां गलत है, और वस्तुतः हर दूसरी आधुनिक भाषा इसे सही मानती है: आप कहते हैं, "यह नामधारी संघर्ष के खिलाफ गार्ड है।" - लेकिन यह क्या नाम स्थान के लिए कर रहे हैं! पैकेज लेखकों पर लोगों को उनके मैला प्रोग्रामिंग प्रथाओं को समायोजित करने के लिए नहीं, पैकेजों का ठीक से उपयोग करने के लिए लोगों को शिक्षित करना है।
कोनराड रुडोल्फ

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)

नमस्कार मैंने आपके दिए गए स्निपेट से एक आर फाइल बनाई। जब मैं उस स्क्रिप्ट को अमेज़ॅन ईएमआर सेवा पर चलाता हूं तो यह मुझे निम्नलिखित यूआरएल के अनुसार आउटपुट देता है। pastie.org/10402378#3,10-11,13
रुबिन पोरवाल

9

एक वैकल्पिक विकल्प पैकेज से आता है easypackages। एक बार स्थापित होने के बाद, आप संकुल को सबसे सहज तरीके से लोड कर सकते हैं:

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

पैकेज में कई पैकेजों को स्थापित करने के लिए एक फ़ंक्शन भी शामिल है:

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

संदर्भ यहाँ


फ़ंक्शन का नाम बल्कि भ्रमित / भ्रमित है। "लाइब्रेरी", libraryफ़ंक्शन में, उस स्थान को संदर्भित करता है जहां पैकेज इंस्टॉल किए जाते हैं: पैकेज लाइब्रेरी । के माध्यम से कई संकुल लोड हो रहा librariesहै कोई मतलब नहीं है। एक अलग कार्य करने के बाद जो packagesकुछ और करता है वह इसे और खराब बनाता है। मुझे पता है कि नामकरण सॉफ्टवेयर इंजीनियरिंग में एक कठिन समस्या है, लेकिन वास्तव में। ये नाम विशेष रूप से खराब हैं।
कोनराड रुडोल्फ़

2
@KonradRudolph मैं असहमत हूं कि नाम का librariesकोई मतलब नहीं है। यह बहुवचन है library, और libraryएक ही पैकेज को लोड करता है; librariesसंकुल की बहुलता लोड करता है। यदि आप इसका libraryअर्थ "अपनी एकल लाइब्रेरी से लोड" के रूप में सोचते हैं , और इसका librariesअर्थ है कि "कई पुस्तकालयों से लोड" का अर्थ है, तो यह शायद अनजाने में है, लेकिन यह इरादा नहीं है; मुझे नाम से काफी खुशी होगी libraries
जेमी एस

@ जैमी लेकिन यह अभी भी (आमतौर पर) एक ही पुस्तकालय से लोड हो रहा है। आप लाइब्रेरी और पैकेज को भ्रमित करने लगते हैं (जो, निष्पक्ष होना आर में आम हो गया है): "आर लाइब्रेरी", जैसा कि मेरी पिछली टिप्पणी में कहा गया है, स्थान (एस) (निर्देशिका / निर्देशिका) को संदर्भित करता है जहां आर पैकेज स्थापित होते हैं । इस उत्तर के उदाहरण में, "plyr", "psych" और "tm" लाइब्रेरी नहीं हैं: ये पैकेज हैं।
कोनराड रुडोल्फ

4

आप बस lubripack पैकेज का उपयोग कर सकते हैं और यह बड़े करीने से नए पैकेज स्थापित करता है और फिर सभी को एक पंक्ति में लोड करता है।

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

RStudio में कोड के ऊपर चलाने के बाद यहां आउटपुट है।

यहां छवि विवरण दर्ज करें

पैकेज कैसे स्थापित करें:

पैकेज डाउनलोड करने के लिए कोड से नीचे चलाएं और इसे GitHub से इंस्टॉल करें। GitHub खाता होना आवश्यक नहीं है।

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

5
मैं पाठ के बजाय छवियों का उपयोग करने का अनुमान
लगाता हूं

3
यह भी एक तरह से सवाल का जवाब नहीं देता है और पहले से ही जवाब नहीं दिया जाता है।
टायलर रिंकर

आप सही हैं, मैंने प्रश्न का उत्तर देने की कोशिश की। चलो यह स्पष्ट करते हैं कि यह सवाल का जवाब हो सकता है।
एस्पांटा

@TylerRinker अब वह कैसे है?
एस्पांता

3

यदि आप उपयोग कर सकते हैं इनपुट के रूप में एक सूची निर्दिष्ट नहीं करना चाहते हैं, तो दरोगिग के समाधान पर निर्माण

# 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()कॉल द्वारा लौटाया और मुद्रित किया गया सूची ऑब्जेक्ट इस मामले में सार्थक नहीं है, इसलिए यह आउटपुट को अदृश्य बनाने के लिए समझ में आता है। कहें कि आप अपने विश्लेषण कार्य के लिए आर नोटबुक का उपयोग करते हैं, invisible()फ़ंक्शन का उपयोग करके सूची ऑब्जेक्ट की सामग्री को दबा देगा और प्रदान की गई नोटबुक फ़ाइल में अव्यवस्था को रोक देगा।


1

पेसर को स्थापित करने और लोड करने के लिए एक चेक जोड़ने के लिए टिलर रिंकर के उत्तर का थोड़ा मोड:

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

मुझे p_load समाधान पसंद है क्योंकि यह उद्धृत करने से बचता है!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.