ठीक है, हम आर में डबल कॉलन ऑपरेटर से परिचित हैं। जब भी मैं कुछ फ़ंक्शन लिखने वाला हूं, तो मैं require(<pkgname>)
का उपयोग करता हूं, लेकिन मैं हमेशा ::
का उपयोग करने के बारे में सोच रहा था। कस्टम कार्यों में require
का उपयोग library
की तुलना में बेहतर अभ्यास है, जो त्रुटि देता है यदि आप न के बराबर पैकेज का एक नाम प्रदान require
रिटर्न चेतावनी और FALSE
, library
के विपरीत, के बाद से।आर लेखन शैली - बनाम ::
दूसरी ओर, ::
ऑपरेटर पैकेज से परिवर्तनीय हो जाता है, जबकि require
पूरे पैकेज को लोड करता है (कम से कम मुझे उम्मीद है), तो मेरे दिमाग में गति अंतर पहले आया। ::
require
से तेज़ होना चाहिए।
और मुझे लगता है कि जाँच करने के लिए कुछ विश्लेषण किया था - मैं क्रमशः require
और ::
साथ दो साधारण कार्यों कि foreign
पैकेज से read.systat
समारोह लोड, लिखा है, इसलिए Iris.syd
डाटासेट आयात कि foreign
पैकेज, दोहराया कार्यों 1000 बार साथ जहाजों प्रत्येक (जो लापरवाही से मनमाना था), और ... कुछ संख्याओं को तोड़ दिया।
अजीब (या नहीं) मैं, उपयोगकर्ता सीपीयू और बीता हुआ समय के मामले में काफी अंतर पाया, जबकि सिस्टम CPU के मामले में कोई महत्वपूर्ण मतभेद थे। और अभी तक और अधिक अजीब निष्कर्ष: ::
वास्तव में धीमा है! ::
के लिए प्रलेखन बहुत ही बदमाश है, और केवल स्रोतों को देखकर यह स्पष्ट है कि ::
बेहतर प्रदर्शन करना चाहिए!
#!/usr/local/bin/r
## with require
fn1 <- function() {
require(foreign)
read.systat("Iris.syd", to.data.frame=TRUE)
}
## times
n <- 1e3
sink("require.txt")
print(t(replicate(n, system.time(fn1()))))
sink()
डबल पेट
#!/usr/local/bin/r
## with ::
fn2 <- function() {
foreign::read.systat("Iris.syd", to.data.frame=TRUE)
}
## times
n <- 1e3
sink("double_colon.txt")
print(t(replicate(n, system.time(fn2()))))
sink()
ले लो सीएसवी डेटा here आवश्यकता होती है। कुछ आंकड़े:
user CPU: W = 475366 p-value = 0.04738 MRr = 975.866 MRc = 1025.134
system CPU: W = 503312.5 p-value = 0.7305 MRr = 1003.8125 MRc = 997.1875
elapsed time: W = 403299.5 p-value < 2.2e-16 MRr = 903.7995 MRc = 1097.2005
एमआरआर require
के लिए मतलब रैंक है, एमआरसी ::
के लिए ibid। मैंने यहां कुछ गलत किया होगा। यह सिर्फ कोई समझ नहीं आता है ... ::
के लिए निष्पादन समय तेजी से लगता है !!! मैंने कुछ खराब कर दिया है, आपको उस विकल्प को त्यागना नहीं चाहिए ...
ठीक है ... मैंने यह देखने के लिए अपना समय बर्बाद कर दिया है कि कुछ अंतर है, और मैंने पूरी तरह से बेकार विश्लेषण किया है, इसलिए , वापस सवाल का:
"क्यों एक require
::
से अधिक पसंद करते हैं चाहिए जब एक समारोह लिख?"
=)
यह एक पैकेज में स्टैंडअलोन कार्य या कार्यों के लिए है? – hadley
इसके अलावा, आपको आमतौर पर प्रत्येक स्क्रिप्ट कॉल में, एक बार अपनी स्क्रिप्ट के शीर्ष पर() की आवश्यकता होती है। – hadley
यह स्टैंडअलोन फ़ंक्शंस के लिए है। मैं एक वेब अनुप्रयोग विकसित कर रहा हूं, और चूंकि रैपैच प्रत्येक HTTP अनुरोध पर नया आर सत्र शुरू करता है, इसलिए मैं अनावश्यक सर्वर लोड से बचने की कोशिश कर रहा हूं। यह उदाहरण अनुचित है - एक बार जब आप फ़ाइल आयात करते हैं, तो काम पूरा हो जाता है, लेकिन एजेक्स कॉल के गुच्छा के साथ एक इंटरैक्टिव वेबपैप में, यह काफी अक्षम हो सकता है। – aL3xa