जैसा कि पहले ही उल्लेख किया गया है, vapply
दो बातें करता है:
- थोड़ा सा गति सुधार
- सीमित वापसी प्रकार के चेक प्रदान करके स्थिरता में सुधार करता है।
दूसरा बिंदु अधिक लाभ है, क्योंकि यह होने से पहले त्रुटियों को पकड़ने में मदद करता है और अधिक मजबूत कोड की ओर जाता है। sapply
का उपयोग करके का उपयोग करके यह वापसी मूल्य जांच अलग-अलग किया जा सकता है ताकि यह सुनिश्चित किया जा सके कि वापसी मूल्य आपके द्वारा अपेक्षित चीज़ों के अनुरूप हैं, लेकिन vapply
थोड़ा आसान है (यदि अधिक सीमित है, क्योंकि कस्टम त्रुटि जांच कोड सीमाओं के भीतर मूल्यों की जांच कर सकता है , आदि।)।
यहां vapply
का एक उदाहरण है जो आपके परिणाम की अपेक्षा है। यह समानांतर कुछ है जो मैं पीडीएफ स्क्रैपिंग पर काम कर रहा था, जहां findD
कच्चे टेक्स्ट डेटा में एक पैटर्न से मेल खाने के लिए regex का उपयोग करेगा (उदाहरण के लिए मेरे पास एक सूची होगी जो split
इकाई द्वारा, और प्रत्येक इकाई के भीतर पते से मिलान करने के लिए एक रेगेक्स होगा। कभी-कभी पीडीएफ को आदेश के रूप में परिवर्तित कर दिया गया था और एक इकाई के लिए दो पते होंगे, जिससे बुरेपन का कारण बनता है)।
> input1 <- list(letters[1:5], letters[3:12], letters[c(5,2,4,7,1)])
> input2 <- list(letters[1:5], letters[3:12], letters[c(2,5,4,7,15,4)])
> findD <- function(x) x[x=="d"]
> sapply(input1, findD)
[1] "d" "d" "d"
> sapply(input2, findD)
[[1]]
[1] "d"
[[2]]
[1] "d"
[[3]]
[1] "d" "d"
> vapply(input1, findD, "")
[1] "d" "d" "d"
> vapply(input2, findD, "")
Error in vapply(input2, findD, "") : values must be length 1,
but FUN(X[[3]]) result is length 2
जैसा कि मैंने अपने छात्रों बताओ, एक प्रोग्रामर अपने सोच बदल रही है बनने के भाग से "त्रुटियों कष्टप्रद रहे हैं" के लिए "त्रुटियों मेरे दोस्त हैं।"
शून्य लंबाई आदानों
एक संबंधित मुद्दा यह है कि अगर इनपुट लंबाई शून्य है, sapply
हमेशा एक खाली सूची प्रदान करेगा इनपुट प्रकार की परवाह किए बिना, है। की तुलना करें:
sapply(1:5, identity)
## [1] 1 2 3 4 5
sapply(integer(), identity)
## list()
vapply(1:5, identity)
## [1] 1 2 3 4 5
vapply(integer(), identity)
## integer(0)
vapply
के साथ, आप उत्पादन का एक विशेष प्रकार है की गारंटी दी जाती है, तो आप शून्य लम्बाई आदानों के लिए अतिरिक्त चेक लिखने की जरूरत नहीं है। क्योंकि यह पहले से ही जानता है क्या प्रारूप में परिणामों की उम्मीद की जानी चाहिए
मानक
vapply
थोड़ा तेजी से हो सकता है।
input1.long <- rep(input1,10000)
library(microbenchmark)
m <- microbenchmark(
sapply(input1.long, findD),
vapply(input1.long, findD, "")
)
library(ggplot2)
library(taRifx) # autoplot.microbenchmark is moving to the microbenchmark package in the next release so this should be unnecessary soon
autoplot(m)
यह अधिक अनुमानित है, कोड को कम अस्पष्ट बना रहा है, और अधिक मजबूत है। विशेष रूप से बड़ी परियोजनाओं में, एक बड़ा पैकेज कहें, यह प्रासंगिक है। –
"पीएस" की कोई ज़रूरत नहीं है ... केवल सवाल का जवाब दें। –
@ कोनराड्रूडॉल्फ कभी-कभी उस प्रभाव को नोट करता है कि सवाल पर ध्यान केंद्रित किया जा सके और "आरटीएफएम" उत्तरों से बचें। :-) –