जवाबों:
एक फ़ंक्शन है जिसे Map
अन्य भाषाओं में नक्शे के समान कहा जा सकता है:
lapply
एक्स के समान लंबाई की एक सूची देता है, जिनमें से प्रत्येक तत्व FUN को X के संबंधित तत्व पर लागू करने का परिणाम है।
do.call
एक नाम या एक फ़ंक्शन से एक फ़ंक्शन कॉल का निर्माण और निष्पादित करता है और इसे पारित करने के लिए तर्कों की एक सूची।
Map
दिए गए वैक्टरों के संगत तत्वों के लिए एक फ़ंक्शन लागू होता है ... Map
एक साधारण आवरण होता है, mapply
जो सामान्य लिस्प के मैपकार (पुनर्नवीनीकरण किए जा रहे तर्कों के साथ) के समान परिणाम को सरल बनाने का प्रयास नहीं करता है। भविष्य के संस्करण परिणाम प्रकार के कुछ नियंत्रण की अनुमति दे सकते हैं।
Map
चारों ओर एक आवरण है mapply
lapply
का एक विशेष मामला है mapply
Map
और lapply
कई मामलों में समान होगा।उदाहरण के लिए, यहाँ है lapply
:
lapply(iris, class)
$Sepal.Length
[1] "numeric"
$Sepal.Width
[1] "numeric"
$Petal.Length
[1] "numeric"
$Petal.Width
[1] "numeric"
$Species
[1] "factor"
और उसी का उपयोग करते हुए Map
:
Map(class, iris)
$Sepal.Length
[1] "numeric"
$Sepal.Width
[1] "numeric"
$Petal.Length
[1] "numeric"
$Petal.Width
[1] "numeric"
$Species
[1] "factor"
do.call
एक फ़ंक्शन को इनपुट के रूप में लेता है और फ़ंक्शन के अपने अन्य तर्कों को विभाजित करता है। यह व्यापक रूप से उपयोग किया जाता है, उदाहरण के लिए, सरल संरचनाओं में सूचियों को इकट्ठा करने के लिए (अक्सर rbind
या इसके साथ cbind
)।
उदाहरण के लिए:
x <- lapply(iris, class)
do.call(c, x)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
"numeric" "numeric" "numeric" "numeric" "factor"
do.call(cbind, x)
वर्तमान संस्करण होने वाला अंतिम उदाहरण मुझे नहीं देता Error in do.call(c, x) : 'what' must be a function or character string
...
cbind()
से अलग है c()
, और यद्यपि यह भी काम करता है, यह अलग-अलग परिणाम देता है।
lapply
एक सूची पर एक फ़ंक्शन लागू करता है, do.call
एक फ़ंक्शन को तर्कों की सूची के साथ कॉल करता है। यह मेरे लिए काफी अंतर की तरह लग रहा है ...
एक सूची के साथ एक उदाहरण देने के लिए:
X <- list(1:3,4:6,7:9)
Lapply के साथ आपको सूची में हर तत्व का अर्थ इस तरह मिलता है:
> lapply(X,mean)
[[1]]
[1] 2
[[2]]
[1] 5
[[3]]
[1] 8
do.call
एक त्रुटि देता है, जैसा कि तर्क "ट्रिम" 1 होने की उम्मीद करता है।
दूसरी ओर, rbind
सभी तर्कों को भुनाता है। तो एक्स रोवे को बांधने के लिए, आप करते हैं:
> do.call(rbind,X)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
यदि आप उपयोग करते हैं lapply
, तो आर rbind
आपको सूची के प्रत्येक तत्व पर लागू करेगा , जो आपको यह बकवास देगा:
> lapply(X,rbind)
[[1]]
[,1] [,2] [,3]
[1,] 1 2 3
[[2]]
[,1] [,2] [,3]
[1,] 4 5 6
[[3]]
[,1] [,2] [,3]
[1,] 7 8 9
मानचित्र जैसा कुछ होने के लिए, आपको आवश्यकता है ?mapply
, जो पूरी तरह से कुछ अलग है। एक्स में हर तत्व का उदाहरण प्राप्त करने के लिए, लेकिन एक अलग ट्रिमिंग के साथ, आप इसका उपयोग कर सकते हैं:
> mapply(mean,X,trim=c(0,0.5,0.1))
[1] 2 5 8
lapply
के समान है map
, do.call
नहीं है। lapply
एक सूची के सभी तत्वों के लिए एक फ़ंक्शन लागू करता है, एक फ़ंक्शन को do.call
कॉल करता है जहां सभी फ़ंक्शन तर्क एक सूची में हैं। एक के लिए तो n
तत्व सूची, lapply
है n
समारोह कॉल, और do.call
सिर्फ एक समारोह कॉल है। तो इससे do.call
काफी अलग है lapply
। आशा है कि यह आपके मुद्दे को स्पष्ट करेगा।
एक कोड उदाहरण:
do.call(sum, list(c(1, 2, 4, 1, 2), na.rm = TRUE))
तथा:
lapply(c(1, 2, 4, 1, 2), function(x) x + 1)
सबसे सरल शब्दों में:
lapply () किसी सूची में प्रत्येक तत्व के लिए दिए गए फ़ंक्शन को लागू करता है, इसलिए कई फ़ंक्शन कॉल होंगे।
do.call () संपूर्ण रूप से सूची में दिए गए फ़ंक्शन को लागू करता है, इसलिए केवल एक फ़ंक्शन कॉल है।
सीखने का सबसे अच्छा तरीका आर प्रलेखन में फ़ंक्शन उदाहरणों के साथ खेलना है।
हालाँकि कई उत्तर दिए गए हैं, यहाँ संदर्भ के लिए मेरा उदाहरण है। मान लीजिए कि हमारे पास डेटा की एक सूची है:
L=list(c(1,2,3), c(4,5,6))
समारोह में lapply एक सूची देता है।
lapply(L, sum)
उपरोक्त का अर्थ नीचे जैसा कुछ है।
list( sum( L[[1]]) , sum( L[[2]]))
अब do.call के लिए समान कार्य करते हैं
do.call(sum, L)
इसका मतलब
sum( L[[1]], L[[2]])
हमारे उदाहरण में, यह 21 देता है। संक्षेप में, लंगोटी हमेशा एक सूची देता है जबकि रिटर्न प्रकार do.all वास्तव में निष्पादित कार्य पर निर्भर करता है।
दोनों के बीच अंतर हैं:
lapply(1:n,function,parameters)
=> यह 1, पैरामीटर को कार्य करने के लिए भेजता है => यह 2, पैरामीटर को फ़ंक्शन और इतने पर भेजता है
do.call
बस एक वेक्टर के रूप में 1… n भेजता है और कार्य करने के लिए पैरामीटर
तो लागू करने में आप n फ़ंक्शन कॉल करते हैं, do.call में आपके पास बस एक है
do.call
कि लगभग उसी तरह है जैसेapply
कि लिस्प में