आवश्यकता () और पुस्तकालय () के बीच अंतर क्या है?


565

बीच क्या अंतर है require()और library()?



7
@ Yihui के ब्लॉग पोस्ट के लिए एक लिंक जोड़ना जब तक वह उत्तर के रूप में इसका एक संस्करण पोस्ट नहीं करना चाहता। yihui.name/en/2014/07/library-vs-require
MichaelChirico

4
@ यिहुई के ब्लॉग पोस्ट को सारांशित करते हुए: "देवियों और सज्जनों, मैंने पहले भी यह कहा है: आर पैकेज को लोड करने के लिए () गलत तरीका है; लाइब्रेरी का उपयोग करें () इसके बजाय"
डे नोवो

1
@ डनॉल ... क्योंकि library()तुरंत जोर से विफल हो जाता है, जल्दी, और एक प्रासंगिक त्रुटि संदेश के साथ (यदि पैकेज स्थापित नहीं है या लोड नहीं किया जा सकता है), जबकि require()एक त्रुटि नहीं उठाती है, बस चुपचाप बूलियन FALSE देता है जो फेंक दिया जाता है और बाद में और अधिक Error: object “bar” not found
क्रिप्टोकरेंसी के

1
@KonradRudolph: हो गया! आपकी प्रतिक्रिया के लिए आपका धन्यवाद।
मार्को

जवाबों:


85

पहले से दी गई अच्छी सलाह के अलावा, मैं इसे जोड़ूंगा:

यह शायद सबसे अच्छा उपयोग कर रहा से बचना है require() , जब तक आप वास्तव में मूल्य यह कुछ त्रुटि जाँच पाश ऐसे में रिटर्न जैसे थियरी द्वारा दिए गए के रूप में उपयोग किया जाएगा।

अधिकांश अन्य मामलों में यह उपयोग करने के लिए बेहतर है library(), क्योंकि इस पर पैकेज लोडिंग समय एक त्रुटि संदेश दे देंगे अगर पैकेज उपलब्ध नहीं है,। require()अगर पैकेज नहीं है तो बस एक त्रुटि के बिना विफल हो जाएगा। यह पता लगाने का सबसे अच्छा समय है कि क्या पैकेज को स्थापित करने की आवश्यकता है (या शायद मौजूद भी नहीं है क्योंकि यह गलत वर्तनी है)। जल्दी त्रुटि प्रतिक्रिया हो रही है और यही कारण है बाद में कोड में विफल रहता है जब यह पुस्तकालय दिनचर्या उपयोग करने का प्रयास प्रासंगिक समय पर नज़र रखने के साथ संभव सिर दर्द से बचने जाएगा


356

रोजमर्रा के काम में एक भी नहीं है।

हालाँकि, दोनों फ़ंक्शन के लिए दस्तावेज़ीकरण के अनुसार ( ?फ़ंक्शन नाम और हिटिंग दर्ज करने से पहले एक्सेस करके ) requireका उपयोग फ़ंक्शंस के अंदर किया जाता है, क्योंकि यह एक चेतावनी को आउटपुट करता है और जारी रहता है अगर पैकेज नहीं मिला है, जबकि libraryएक त्रुटि होगी।


1
#richiemorrisroe: धन्यवाद। क्या इसका मतलब यह है कि अगर मुझे अपने आर-कोड की शुरुआत में जिन पैकेजों की ज़रूरत है, उन्हें लोड करूं तो इससे कोई फर्क नहीं पड़ता कि मैं किसे चुनता हूं?
मार्को

6
जब तक आप किसी फ़ंक्शन के अंदर पैकेज लोड नहीं कर रहे हैं, यह वास्तव में कोई फर्क नहीं पड़ता है। मैं की आवश्यकता का उपयोग कर मेरे सभी संकुल लोड, और फ्लॉप पता क्या अंतर नहीं था जब तक मैं अपने प्रश्न को देखने के बाद मदद की पढ़ें।
रिचमीमोर्रिसो

45
अन्य कारण जो मैं उपयोग करता हूं requireवह यह है कि यह मुझे संकुल के रूप में संदर्भित करता है libraries, एक अभ्यास जो दीवार पर आर-कॉग्नोसेंटी को चलाता है। libraryनिर्देशिका स्थान जहां संकुल बैठते हैं।
IRTFM

22
उनमें बहुत प्रासंगिक अंतर हैं। का उपयोग न करें require, जब तक कि आप वापसी मान की जाँच (और उस मामले में वहां आम तौर पर बेहतर विकल्प जैसे हैं, loadNamespace)।
कोनराड रूडोल्फ

256

इसका एक और लाभ require()यह है कि यह डिफ़ॉल्ट रूप से तार्किक मान लौटाता है। TRUEअगर पैकेज लोड किया गया है, FALSEअगर यह नहीं है।

> test <- library("abc")
Error in library("abc") : there is no package called 'abc'
> test
Error: object 'test' not found
> test <- require("abc")
Loading required package: abc
Warning message:
In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE,  :
  there is no package called 'abc'
> test
[1] FALSE

तो आप require()नीचे दिए गए जैसे निर्माणों में उपयोग कर सकते हैं । जो मुख्य रूप से काम करता है, तो आप संकुल स्थापित नहीं किया जा सकता है कर रहे थे हमारे आर स्थापना के लिए अपने कोड वितरित करना चाहते हैं।

if(require("lme4")){
    print("lme4 is loaded correctly")
} else {
    print("trying to install lme4")
    install.packages("lme4")
    if(require(lme4)){
        print("lme4 installed and loaded")
    } else {
        stop("could not install lme4")
    }
}

65

आप उपयोग कर सकते हैं require()यदि आप पैकेज को स्थापित करना चाहते हैं यदि और केवल आवश्यक हो तो, जैसे:

if (!require(package, character.only=T, quietly=T)) {
    install.packages(package)
    library(package, character.only=T)
}

कई पैकेज के लिए आप उपयोग कर सकते हैं

for (package in c('<package1>', '<package2>')) {
    if (!require(package, character.only=T, quietly=T)) {
        install.packages(package)
        library(package, character.only=T)
    }
}

प्रो युक्तियाँ:

  • जब स्क्रिप्ट के अंदर उपयोग किया जाता है, तो आप के reposपैरामीटर को निर्दिष्ट करके एक संवाद स्क्रीन से बच सकते हैं install.packages(), जैसे कि

    install.packages(package, repos="http://cran.us.r-project.org")
  • आप पैकेज स्टार्टअप संदेशों को अच्छी तरह से लपेट require()और library()इन कर सकते हैं suppressPackageStartupMessages(), और require(..., quietly=T, warn.conflicts=F)इंस्टाल को शांत रखने के लिए यदि आवश्यक हो तो मापदंडों का उपयोग भी कर सकते हैं।


46

हमेशा उपयोग करें library। कभी 1 उपयोग require

( 1 लगभग कभी नहीं। हो सकता है ।)

संक्षेप में, यह इसलिए है क्योंकि उपयोग करते समय require, आपका कोड त्रुटि के संकेत के बिना , अलग-अलग, गलत परिणाम दे सकता है । यह दुर्लभ है लेकिन काल्पनिक नहीं है! इस कोड पर विचार करें, जो {dplyr} लोड किए जाने के आधार पर अलग-अलग परिणाम देता है :

require(dplyr)

x = data.frame(y = seq(100))
y = 1
filter(x, y == 1)

इससे सूक्ष्म रूप से गलत परिणाम हो सकते हैं। का उपयोग libraryकरने के बजाय requireयहां एक त्रुटि फेंकता है, स्पष्ट रूप से संकेत है कि कुछ गलत है। यह अच्छा है

यह अन्य सभी विफलताओं को डीबग करना भी मुश्किल बनाता है: यदि आप requireअपनी स्क्रिप्ट की शुरुआत में एक पैकेज और लाइन 500 में इसके निर्यात का उपयोग करते हैं, तो आपको लाइन के बजाय 500 में एक त्रुटि संदेश "ऑब्जेक्ट 'फू' नहीं मिला" मिलेगा त्रुटि "bla 'नामक कोई पैकेज नहीं है"।

केवल स्वीकार्य उपयोग का मामला है require, जब इसके वापसी मूल्य की तुरंत जाँच की जाती है, जैसा कि कुछ अन्य उत्तर दिखाते हैं। यह एक काफी सामान्य पैटर्न है, लेकिन इन मामलों में भी अस्तित्व की जांच और पैकेज को लोड करने के बजाय अलग करने के लिए यह बेहतर (और अनुशंसित, नीचे देखें) है।

अधिक तकनीकी रूप से, requireवास्तव में libraryआंतरिक रूप से कॉल करता है (यदि पैकेज पहले से संलग्न नहीं था - requireइस प्रकार एक निरर्थक जांच करता है, क्योंकि library यह भी जांचता है कि पैकेज पहले से लोड था या नहीं)। यहाँ requireयह स्पष्ट करने के लिए एक सरल कार्यान्वयन है कि यह क्या करता है:

require = function (package) {
    already_attached = paste('package:', package) %in% search()
    if (already_attached) return(TRUE)
    maybe_error = try(library(package, character.only = TRUE)) 
    success = ! inherits(maybe_error, 'try-error')
    if (! success) cat("Failed")
    success
}

अनुभवी आर डेवलपर्स सहमत हैं:

Yihui Xie , {knitr}, {bookdown} के लेखक और कई अन्य पैकेज कहते हैं :

देवियों और सज्जनों, मैं कहा है इस से पहले: की आवश्यकता होती है () एक अनुसंधान पैकेज लोड करने के लिए गलत तरीके से होता है; लाइब्रेरी () का उपयोग करें

किसी और की तुलना में अधिक लोकप्रिय आर संकुल के लेखक हैडली विकम कहते हैं

library(x)डेटा विश्लेषण लिपियों में उपयोग करें । […] आपको कभी भी उपयोग करने की आवश्यकता नहीं है require()( requireNamespace()यह लगभग हमेशा बेहतर होता है)


जब तक आप वाक्य रचना के साथ सभी कार्यों को कॉल नहीं कर रहे हैं, मैं ठीक उसी तरह इंगित करने वाला था class::function, library()ठीक से बचने के लिए उपयोग करें।
भूत

19
?library

और तुम देखोगे:

library(package)और require(package)दोनों पैकेज को नाम के साथ लोड करते हैं packageऔर इसे खोज सूची में डालते हैं। requireअन्य कार्यों के अंदर उपयोग के लिए डिज़ाइन किया गया है; यदि पैकेज मौजूद नहीं है तो यह लौटता है FALSEऔर चेतावनी देता है (बजाय त्रुटि के रूप library()में डिफ़ॉल्ट रूप से)। दोनों फ़ंक्शन वर्तमान में लोड किए गए पैकेजों की सूची की जांच करते हैं और अपडेट करते हैं और पहले से लोड किए गए पैकेज को फिर से लोड नहीं करते हैं। (यदि आप इस तरह के पैकेज को फिर से लोड करना चाहते हैं, तो कॉल detach(unload = TRUE)या unloadNamespaceपहले।) यदि आप किसी पैकेज को खोज सूची में डाले बिना लोड करना चाहते हैं, तो उपयोग करें requireNamespace


9

अंतर के बारे में मेरा प्रारंभिक सिद्धांत यह था कि libraryपैकेज लोड करता है कि क्या यह पहले से लोड है या नहीं, अर्थात यह पहले से लोड किए गए पैकेज को फिर से लोड कर सकता है, जबकि requireयह जांचता है कि यह लोड है, या इसे लोड करता है यदि यह नहीं है (इस प्रकार कार्यों में उपयोग यह एक निश्चित पैकेज पर निर्भर करता है)। हालाँकि, दस्तावेज़ीकरण इसका खंडन करता है, और स्पष्ट रूप से बताता है कि न तो फ़ंक्शन पहले से लोड किए गए पैकेज को फिर से लोड करेगा।


18
यह दिलचस्प है, लेकिन वास्तव में इस सवाल का जवाब नहीं है ...?
बेन बोलकर


3

यहां पहले से लोड पैकेज पर अंतर प्रतीत होता है। हालांकि यह सच है कि दोनों की आवश्यकता होती है और पुस्तकालय पैकेज लोड न करें। लाइब्रेरी जाँच और निकास से पहले बहुत सी अन्य चीजें करती है।

मैं वैसे भी 2mil बार चलने वाले फ़ंक्शन की शुरुआत से "आवश्यकता" को हटाने की सलाह दूंगा, लेकिन अगर, किसी कारण से मुझे इसे रखने की आवश्यकता होती है। आवश्यकता तकनीकी रूप से एक तेज जांच है।

microbenchmark(req = require(microbenchmark), lib = library(microbenchmark),times = 100000)
Unit: microseconds
 expr    min     lq      mean median     uq        max neval
  req  3.676  5.181  6.596968  5.655  6.177   9456.006 1e+05
  lib 17.192 19.887 27.302907 20.852 22.490 255665.881 1e+05

मेरा तर्क है कि यह कार्यान्वयन को ठीक करने के लिए एक मजबूत कारण है library(दोनों फ़ंक्शन, जैसा कि वर्तमान में आर के साथ भेज दिया गया है, एक बड़ी गड़बड़ है)।
कोनराड रूडोल्फ

@KonradRudolph अच्छी तरह से, अगर कोई पुस्तकालय को ठीक करने जा रहा है, तो शायद वे संस्करण द्वारा लोडिंग को भी स्पष्ट रूप से सक्षम कर सकते हैं और अनुलग्नक को एक तर्क विकल्प बना सकते हैं
आकृति

हां, मैं बिल्कुल सहमत हूं लेकिन वे केवल प्रदर्शन ही नहीं बल्कि शब्दार्थ को भी बदल देंगे। वैसे भी, आर में पैकेज के साथ संस्करण कभी भी काम नहीं करेगा, दुर्भाग्य से। मैं इस के लिए एक प्रतिस्थापन पर काम कर रहा हूँ (वास्तव में!)। संलग्न करने के लिए, आप उपयोग कर सकते हैं loadNamespace, जो एक पैकेज को लोड करता है और उसके नाम स्थान को देता है, इसे संलग्न किए बिना।
कोनराड रुडोल्फ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.