আমি সম্প্রতি আর শিখছি এবং দুটি ফাংশন দ্বারা বিভ্রান্ত: lapplyএবং do.call। দেখে মনে হচ্ছে যে তারা mapলিস্পে কাজ করার মতোই । তবে কেন এইরকম আলাদা নামের সাথে দুটি কার্য রয়েছে? আর কেন কেবল ডাকা একটি ফাংশন ব্যবহার করে না map?
আমি সম্প্রতি আর শিখছি এবং দুটি ফাংশন দ্বারা বিভ্রান্ত: lapplyএবং do.call। দেখে মনে হচ্ছে যে তারা mapলিস্পে কাজ করার মতোই । তবে কেন এইরকম আলাদা নামের সাথে দুটি কার্য রয়েছে? আর কেন কেবল ডাকা একটি ফাংশন ব্যবহার করে না map?
উত্তর:
একটি ফাংশন বলা হয় Mapযা অন্য ভাষায় মানচিত্রের অনুরূপ হতে পারে:
lapply এক্স হিসাবে সমান দৈর্ঘ্যের একটি তালিকা প্রদান করে, যার প্রতিটি উপাদানই X এর সাথে সম্পর্কিত উপাদানগুলিতে FUN প্রয়োগের ফলাফল
do.call একটি নাম বা একটি ফাংশন থেকে ফাংশন কল তৈরি করে এবং সম্পাদন করে এবং এতে আর্গুমেন্টের তালিকা সরবরাহ করা হয়।
Mapপ্রদত্ত ভেক্টরগুলির সংশ্লিষ্ট উপাদানগুলিতে একটি ফাংশন প্রয়োগ করে ... Mapএকটি সাধারণ মোড়ক mapplyযা সাধারণ সরল করার চেষ্টা করে না, সাধারণ লিস্পের ম্যাপকারের মতো (তবে যুক্তিগুলি পুনর্ব্যবহৃত হওয়ার সাথে)। ভবিষ্যতের সংস্করণগুলি ফলাফল ধরণের কিছু নিয়ন্ত্রণের অনুমতি দিতে পারে।
Map চারপাশে একটি মোড়ক হয় mapplylapply একটি বিশেষ ক্ষেত্রে mapplyMapএবং 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()এবং এটিও কাজ করে তবে এটি বিভিন্ন ফলাফল দেয় gives
lapplyএকটি তালিকার উপরে একটি ফাংশন প্রয়োগ করে do.call, আর্গুমেন্টের তালিকা সহ একটি ফাংশন কল করে। এটি আমার কাছে বেশ পার্থক্যের মতো দেখাচ্ছে ...
একটি তালিকা সহ একটি উদাহরণ দিতে:
X <- list(1:3,4:6,7:9)
ল্যাপলি দিয়ে আপনি তালিকার প্রতিটি উপাদানটির গড় এইভাবে পাবেন:
> 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, যা সম্পূর্ণ আলাদা is উদাহরণস্বরূপ এক্স এর প্রতিটি উপাদানের গড় পেতে, তবে আলাদা ট্রিমিংয়ের সাহায্যে আপনি এটি ব্যবহার করতে পারেন:
> 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)
খুব সাধারণ কথায়:
ল্যাপলি () তালিকার প্রতিটি উপাদানগুলির জন্য একটি প্রদত্ত ফাংশন প্রয়োগ করে, তাই বেশ কয়েকটি ফাংশন কল আসবে।
do.call () সামগ্রিকভাবে তালিকায় প্রদত্ত ফাংশন প্রয়োগ করে, সুতরাং কেবলমাত্র একটি ফাংশন কল রয়েছে।
শেখার সর্বোত্তম উপায় হ'ল আর ডকুমেন্টেশনে ফাংশনের উদাহরণগুলি নিয়ে ঘুরে বেড়ানো।
যদিও অনেক উত্তর আছে, এখানে রেফারেন্সের জন্য আমার উদাহরণ। মনে করুন আমাদের কাছে ডেটাগুলির একটি তালিকা রয়েছে:
L=list(c(1,2,3), c(4,5,6))
ফাংশনটি ল্যাপলি একটি তালিকা দেয়।
lapply(L, sum)
উপরের অর্থ নীচের মতো কিছু।
list( sum( L[[1]]) , sum( L[[2]]))
এখন আসুন do.call এর জন্য একই কাজ করি
do.call(sum, L)
এর অর্থ
sum( L[[1]], L[[2]])
আমাদের উদাহরণস্বরূপ, এটি 21 প্রত্যাবর্তন করে pp সংক্ষেপে, ল্যাপলি সর্বদা একটি তালিকা দেয় যখন ডোকল সব ধরনের রিটার্ন টাইপ কার্যকরভাবে সম্পাদিত ফাংশনের উপর নির্ভর করে।
উভয়ের মধ্যে পার্থক্য হ'ল:
lapply(1:n,function,parameters)
=> এটি 1, ফাংশনটির জন্য প্যারামিটারগুলি => এটি 2, পরামিতিগুলি ফাংশনে প্রেরণ করে on
do.call
কেবল ভ্যাক্টর হিসাবে 1… n প্রেরণ করে ফাংশন করার জন্য প্যারামিটার
সুতরাং প্রয়োগ করার জন্য আপনার ড ফ্যাকাল কলগুলিতে এন ফাংশন কল রয়েছে, আপনার কাছে কেবল একটি রয়েছে
do.callযেমন প্রায় একইapplyপাতার মর্মর মধ্যে