একাধিক পরামিতি সহ ফাংশন প্রয়োগ


128

আমি f(var1, var2)আর তে একটি ফাংশন রেখেছি ধরুন আমরা সেট করেছি var2 = 1এবং এখন আমি f()তালিকায় ফাংশনটি প্রয়োগ করতে চাই L। মূলত আমি আউটপুটগুলির সাথে একটি নতুন তালিকা এল * পেতে চাই

[f(L[1],1),f(L[2],1),...,f(L[n],1)]

আমি কীভাবে এটি দিয়ে করব apply, mapplyবা lapply?


উত্তর:


190

কেবল প্রয়োগ ফাংশনগুলির একটিতে অতিরিক্ত যুক্তি হিসাবে var2 পাস করুন 2

mylist <- list(a=1,b=2,c=3)
myfxn <- function(var1,var2){
  var1*var2
}
var2 <- 2

sapply(mylist,myfxn,var2=var2)

এই একই পাসের var2প্রতিটি কলে myfxn। পরিবর্তে যদি আপনি প্রতিটি কল চান myfxn1 ম / 2 য় / 3 য় / ইত্যাদি পেতে। উভয়ের উপাদান mylistএবং var2, তারপরে আপনি mapplyএর ডোমেনে রয়েছেন ।


5
কিন্তু মনে রাখবেন যে myfxnvectorised করা যেতে পারে, যা ক্ষেত্রে এক ব্যবহার করা উচিতmyfxn(unlist(mylist), var2=var2)
— Baptiste

আসল উদাহরণটি অস্পষ্ট ছিল তবে মনে হয়েছিল অ-ভেক্টরাইজড। পয়েন্ট ভালভাবে নেওয়া হয়েছে।
— এরি বি ফ্রেডম্যান

এই কাজটিকে "উড়ন্ত অবস্থায়" হিসাবে কাজ করার উপায় কি? এর মতো কিছু: sapply(mylist, function(var1, var2) { var1*var2 }, var=thisvar2)তবে আমি একটি ত্রুটি পেয়েছি যে আর্গুমেন্ট 2 একাধিক আনুষ্ঠানিক যুক্তির সাথে মেলে
— ইমুড্রাক

1
@ এমুদ্রাক আমার মনে হয় যে সমস্যাটি ঠিক আছে যে আপনি যুক্তিটির varপরিবর্তে পাস করার নামটিই নামকরণ করছেন var2। আর আপনি যা বলতে চাইছেন তা দিব্যি করতে পারে না।
— এরি বি ফ্রেডম্যান

49

যদি আপনার ফাংশনটিতে দুটি ভেক্টর ভেরিয়েবল থাকে এবং সেগুলির প্রতিটি মানের জন্য নিজেকে গুনতে হয় (@ আরি বি ফ্রেডম্যান দ্বারা উল্লিখিত) আপনি mapplyনিম্নলিখিত হিসাবে ব্যবহার করতে পারেন :

vars1<-c(1,2,3)
vars2<-c(10,20,30)
mult_one<-function(var1,var2)
{
   var1*var2
}
mapply(mult_one,vars1,vars2)

যা আপনাকে দেয়:

> mapply(mult_one,vars1,vars2)
[1] 10 40 90

3
সাধারণকরণের জন্য একটি আপভোট, এমনকি সাধারণ এবং স্পষ্ট উদাহরণ সহ।
— জেএসসি

mapplyযদি vars1একটি একক উপাদান থাকে তবে পুনর্ব্যবহার করবে । উদাহরণস্বরূপ কখন vars1 <- 3, mapply(mult_one, vars1, vars2)ফেরত দেয় 30 60 90। এটি কার্যকর যখন আপনি lapplyকোনও ফাংশনের দ্বিতীয় যুক্তি ব্যবহার করতে চান ।
— পল রাউজিউক্স

3

@ আলেকজান্ডারের উদাহরণটিকে আরও সাধারণ করতে, outerএমন ক্ষেত্রে প্রাসঙ্গিক যেখানে কোনও ফাংশন অবশ্যই প্রতিটি জোড় ভেক্টরের মানগুলির মধ্যে নিজেকে গণনা করতে পারে :

vars1<-c(1,2,3)
vars2<-c(10,20,30)
mult_one<-function(var1,var2)
{
   var1*var2
}
outer(vars1,vars2,mult_one)

দেয়:

> outer(vars1, vars2, mult_one)
     [,1] [,2] [,3]
[1,]   10   20   30
[2,]   20   40   60
[3,]   30   60   90
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.