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


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.