जैसा कि पहले ही उल्लेख किया गया है, vapply
दो चीजें करता है:
- थोड़ा गति सुधार
- सीमित रिटर्न प्रकार चेक प्रदान करके स्थिरता में सुधार करता है।
दूसरा बिंदु अधिक से अधिक लाभ है, क्योंकि यह होने से पहले त्रुटियों को पकड़ने में मदद करता है और अधिक मजबूत कोड की ओर जाता है। इस वापसी मान की जाँच का उपयोग कर से अलग किया जा सकता है sapply
, जिसके बाद stopifnot
यह सुनिश्चित करें कि वापसी मान जिसकी आपको उम्मीद के अनुरूप हैं बनाने के लिए है, लेकिन 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)
sapply(integer(), identity)
vapply(1:5, identity)
vapply(integer(), identity)
इसके साथ vapply
, आपको एक विशेष प्रकार के आउटपुट की गारंटी है, इसलिए आपको शून्य लंबाई इनपुट के लिए अतिरिक्त चेक लिखने की आवश्यकता नहीं है।
मानक
vapply
थोड़ा तेज हो सकता है क्योंकि यह पहले से ही जानता है कि इसमें परिणाम की अपेक्षा किस प्रारूप में होनी चाहिए।
input1.long <- rep(input1,10000)
library(microbenchmark)
m <- microbenchmark(
sapply(input1.long, findD ),
vapply(input1.long, findD, "" )
)
library(ggplot2)
library(taRifx)
autoplot(m)