2013-05-27 3 views
7

मैं एकाधिक फ़ंक्शंस के साथ अतिरिक्त तर्कों को पारित करने के लिए पर्याप्त लचीला मुख्य फ़ंक्शन कैसे लिखूं? सरल प्रयास विफल रहे हैं:इलिप्सिस तर्कों के साथ दो अलग-अलग कार्यों में गुजर रहा है?

> mainF <- function(f1,f2,...) { 
+  f2(X=f1(...), ...) 
+ } 
> mainF(function(x) x, function(X, y) X*y, x=5, y=3) 
Error in f2(X = f1(...), ...) : unused argument (x = 5) 

मैं देख सकता हूँ कि यह कैसे औपचारिक जांच और प्रत्येक कार्य की औपचारिक करने के लिए अंडाकार में कॉल तर्क मिलान के द्वारा ही संभव हो सकता है। क्या कोई बेहतर तरीका है, यद्यपि?

+3

आप subfunctions से एक के लिए एक सूची पारित कर सकते हैं, यानी 'mainF < - फ़ंक्शन (एफ 1, एफ 2, ..., args.f2 = सूची()) '। – baptiste

+0

मुहावरे @baptiste उल्लेखों के अलावा (जिसे अक्सर आर स्रोतों में उपयोग किया जाता है) के अलावा, आप तर्क प्रसंस्करण क्षेत्र में हैं। आप '...' प्राप्त कर सकते हैं, 'f1' और 'f2' के तर्क नाम' फॉर्मल्स() 'के माध्यम से प्राप्त कर सकते हैं, फिर प्रत्येक फ़ंक्शन के लिए तर्क निकालने के लिए पकड़ लिया गया' ...' सूची संसाधित करें। क्या होता है हालांकि जब 'एफ 1' और' एफ 2 'के समान तर्क हैं? यही कारण है कि बपतिस्मा देने का विचार एक आसान है; उपयोगकर्ता द्वारा निर्दिष्ट तर्कों के सही सेट के साथ आपको 'f2' को कॉल करने के लिए' do.call (f2, args.f2) 'की आवश्यकता है। –

+0

यह एक अच्छा मुहावरे है। मैंने शायद इसे बेस आर में दस लाख बार देखा है, लेकिन ऐसा कुछ कारणों से ऐसा करने के लिए मेरे पास नहीं हुआ। उत्तर के रूप में @baptiste पोस्ट? –

उत्तर

3

आप subfunctions से एक के लिए एक सूची पारित कर सकते हैं, यानी

mainF <- function(f1, f2, ..., args.f2 = list()) { 
    do.call(f2, c(X=f1(...), args.f2)) 
} 

mainF(function(x) x, function(X, y) X*y, x=5, args.f2 = list(y=3)) 

(अपरीक्षित, लेकिन आप सार मिल गया)

संबंधित मुद्दे