Lapply के FUN (और अन्य * लागू) के लिए कई तर्क पारित करना


99

मेरे पास एक फ़ंक्शन में कई तर्कों को पारित करने के बारे में एक प्रश्न है, जब में उपयोग करता lapplyहै R

जब मैं lapply का सिंटैक्स के साथ उपयोग करता हूं lapply(input, myfun);- यह आसानी से समझ में आता है, और मैं इस तरह से myfun को परिभाषित कर सकता हूं:

myfun <- function(x) {
 # doing something here with x
}

lapply(input, myfun);

और तत्वों inputको xतर्क के रूप में पारित किया जाता है myfun

लेकिन क्या होगा अगर मुझे कुछ और तर्कों को पारित करने की आवश्यकता है myfunc? उदाहरण के लिए, इसे इस तरह परिभाषित किया गया है:

myfun <- function(x, arg1) {
 # doing something here with x and arg1
}

मैं इस फ़ंक्शन का उपयोग दोनों inputतत्वों ( xतर्क के रूप में ) और कुछ अन्य तर्क के साथ कैसे कर सकता हूं ?


R कंसोल इनपुट लाइनों को ";" के साथ समाप्त करना यह संकेत है कि आपने अतीत में कुछ मैक्रो प्रोसेसिंग भाषा का उपयोग किया था। ट्रिपल डॉट्स का तर्क "आर के लिए" परिचय "सेक्शन" के "अपने स्वयं के कार्यों को लिखने" के उप-भाग 4 में वर्णित है, यकीनन पहला "मैनुअल" जिसे आपको पढ़ना चाहिए।
IRTFM

जवाबों:


121

यदि आप सहायता पृष्ठ को देखते हैं, तो उनमें से एक तर्क lapplyरहस्यमय है ...। जब हम सहायता पृष्ठ के तर्क खंड को देखते हैं, तो हम निम्नलिखित पंक्ति पाते हैं:

...: optional arguments to ‘FUN’.

इसलिए आपको केवल lapplyएक तर्क के रूप में कॉल में अपने अन्य तर्क को शामिल करना है , जैसे:

lapply(input, myfun, arg1=6)

और lapply, यह पहचानना कि arg1यह एक तर्क नहीं है कि यह जानता है कि इसके साथ क्या करना है, स्वचालित रूप से इस पर पारित होगा myfun। अन्य सभी applyकार्य समान कार्य कर सकते हैं।

एक परिशिष्ट: आप ...अपने स्वयं के कार्यों को लिखते समय भी उपयोग कर सकते हैं । उदाहरण के लिए, मान लें कि आप एक फ़ंक्शन लिखते हैं plotजो कुछ बिंदु पर कॉल करता है , और आप अपने फ़ंक्शन कॉल से प्लॉट मापदंडों को बदलने में सक्षम होना चाहते हैं। आप अपने कार्य में तर्क के रूप में प्रत्येक पैरामीटर को शामिल कर सकते हैं, लेकिन यह कष्टप्रद है। इसके बजाय आप उपयोग कर सकते हैं ...(अपने फ़ंक्शन के लिए एक तर्क के रूप में और इसके भीतर कॉल करने के लिए कॉल करें), और कोई भी तर्क है कि आपका फ़ंक्शन पहचान नहीं करता है स्वचालित रूप से पास हो जाता है plot


यदि आपका दूसरा arg, उदाहरण के लिए, "arg1" एक सूची है जो "इनपुट" सूची से मेल खाती है? जब मैं lapply (इनपुट, myfun, arg1 = input2) की कोशिश करता हूं, जहां input2 एक सूची है, ऐसा लगता है कि lapply तत्व के बजाय 'इनपुट' के साथ तत्व द्वारा पूरी सूची को पास करता है।
एलन

10
मुझे बस एक और पोस्ट में जवाब मिला जो काम करता है: mapply (myfun, df $ input, df $ input2)
एलन

18

एलन द्वारा सुझाए गए अनुसार, 'mapply' फ़ंक्शन कई एकाधिक सूचियों या वेक्टर तर्क पर एक फ़ंक्शन लागू करता है:

mapply(myfun, arg1, arg2)

मैन पेज देखें: https://stat.ethz.ch/R-manual/R-devel/library/base/html/mapply.html


और यह outerएक ही नस में ध्यान देने योग्य है, जो दो वेक्टर तर्कों में मूल्यों की प्रत्येक जोड़ी के लिए एक फ़ंक्शन लागू करता है। मैन पेज: stat.ethz.ch/R-manual/R-devel/library/base/html/outer.html
ms609

11

आप इसे निम्न तरीके से कर सकते हैं:

 myfxn <- function(var1,var2,var3){
      var1*var2*var3

    }

    lapply(1:3,myfxn,var2=2,var3=100)

और आपको जवाब मिलेगा:

[[१]] [१] २००

[[२]] [१] ४००

[[३]] [१] ६००


3
myfun <- function(x, arg1) {
 # doing something here with x and arg1
}

xएक वेक्टर या एक सूची है और myfunमें lapply(x, myfun)के प्रत्येक तत्व के लिए कहा जाता है xअलग से।

विकल्प 1

यदि आप arg1प्रत्येक myfunकॉल ( myfun(x[1], arg1), myfun(x[2], arg1)आदि) में संपूर्ण का उपयोग करना चाहते हैं , तो उपयोग करें lapply(x, myfun, arg1)(जैसा कि ऊपर कहा गया है)।

विकल्प 2

यदि आप फिर भी ( , आदि) के तत्वों के साथ अलग myfunसे प्रत्येक तत्व को कॉल करना चाहते हैं , तो इसका उपयोग करना संभव नहीं है । इसके बजाय, उपयोग (जैसा कि ऊपर कहा गया है) या :arg1xmyfun(x[1], arg1[1])myfun(x[2], arg1[2])lapplymapply(myfun, x, arg1)apply

 apply(cbind(x,arg1), 1, myfun)

या

 apply(rbind(x,arg1), 2, myfun).
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.