যেমনটি ইতিমধ্যে উল্লেখ করা হয়েছে, vapply
দুটি কাজ করে:
- সামান্য গতির উন্নতি
- সীমিত ফেরতের ধরণের চেক সরবরাহ করে ধারাবাহিকতা উন্নত করে।
দ্বিতীয় পয়েন্টটি হ'ল বৃহত্তর সুবিধা, কারণ এটি হওয়ার আগে ত্রুটিগুলি ধরতে সহায়তা করে এবং আরও দৃ code় কোডের দিকে নিয়ে যায়। এই রিটার্ন ভ্যালু চেকিংটি পৃথকভাবে sapply
অনুসরণ করে stopifnot
এটি ব্যবহার করে নিশ্চিত করা যায় যে রিটার্নের মানগুলি আপনার প্রত্যাশার সাথে সামঞ্জস্যপূর্ণ, তবে vapply
এটি কিছুটা সহজ (যদি আরও সীমাবদ্ধ থাকে, যেহেতু কাস্টম ত্রুটি পরীক্ষা করার কোডটি সীমানার মধ্যে মানগুলি পরীক্ষা করতে পারে ইত্যাদি ইত্যাদি) make )।
vapply
আপনার ফলাফলটি নিশ্চিত করার একটি উদাহরণ এখানে প্রত্যাশার মতো। এটি পিডিএফ স্ক্র্যাপ করার সময় আমি যেখানে কাজ করছিলাম তার সমান্তরাল কিছু, যেখানে findD
এটি ব্যবহার করবেregexকাঁচা টেক্সট ডেটাতে একটি প্যাটার্নটি মেলে (যেমন আমার split
সত্তা অনুসারে একটি তালিকা ছিল এবং প্রতিটি সত্তার মধ্যে ঠিকানা মেলে একটি রেজেক্স ছিল Occ মাঝে মাঝে পিডিএফটি আউট-অর্ডারে রূপান্তরিত হয়ে যায় এবং সেখানে দুটি ঠিকানা থাকত সত্তা, যা খারাপ লাগায়)।
> 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)