हमेशा उपयोग करें 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()
यह लगभग हमेशा बेहतर होता है)