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