कई मापदंडों के साथ फ़ंक्शन लागू करें


128

मेरे पास f(var1, var2)R में एक फ़ंक्शन है। मान लीजिए कि हमने सेट किया है var2 = 1और अब मैं फ़ंक्शन f()को सूची में लागू करना चाहता हूं L। मूल रूप से मैं आउटपुट के साथ एक नई सूची एल * प्राप्त करना चाहता हूं

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

मैं या तो यह कैसे करूँ apply, mapplyया lapply?


जवाबों:


190

लागू कार्यों में से एक के लिए एक अतिरिक्त तर्क के रूप में बस var2 पास करें।

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 / 3rd / etc प्राप्त करने के लिए प्रत्येक कॉल चाहते हैं । दोनों का तत्व mylistऔर var2, फिर आप mapplyडोमेन में हैं।


5
लेकिन ध्यान दें कि myfxnवेक्टर हो सकता है, जिस स्थिति में एक का उपयोग करना चाहिएmyfxn(unlist(mylist), var2=var2)
बपतिस्मा देने वाला

मूल उदाहरण स्पष्ट नहीं था, लेकिन गैर-वेक्टरकृत प्रतीत होता था। प्वाइंट अच्छी तरह से लिया, हालांकि।
अरी बी। फ्रीडमैन

क्या यह काम "मक्खी पर?" कुछ इस तरह: sapply(mylist, function(var1, var2) { var1*var2 }, var=thisvar2)लेकिन मुझे एक त्रुटि मिलती है कि तर्क 2 कई औपचारिक तर्कों से मेल खाता है
एमुद्रक

1
@emudrak मुझे लगता है कि समस्या यह है कि आप जिस तर्क को नाम दे रहे हैं, उसके varबजाय आप पास हैं var2। R का मतलब यह नहीं हो सकता कि आप क्या करें।
अरी बी। फ्रीडमैन

49

यदि आपके फ़ंक्शन के दो वेक्टर वैरिएबल हैं और उनमें से प्रत्येक मूल्य पर खुद को गणना करनी चाहिए (जैसा कि @Ari B. Friedman द्वारा उल्लेख किया गया है) आप 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
एक सरल और स्पष्ट उदाहरण के साथ, सामान्यीकरण के लिए एक उत्थान।
JASC

mapplyvars1एकल तत्व होने पर भी रीसायकल करेगा । उदाहरण के लिए 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.