2011-05-31 15 views
7

में मनमाने ढंग से काम करता है लागू करने के लिए कैसे एक आर में समारोह apply.func(func, arg.list) है, जो एक मनमाना समारोह func और एक उपयुक्त सूची arg.list तर्कों के रूप लेता है, और arg.list में निहित तर्क के साथ func बुलाने की परिणाम देता लागू करेगा। जैसेसमारोह आर

apply.func(foo, list(x="A", y=1, z=TRUE)) 

foo(x="A", y=1, z=TRUE) 

धन्यवाद के बराबर है!

पीएस Fwiw, apply.func का अजगर बराबर की तरह

def apply_func(func, arg_list): 
    return func(*arg_list) 

या

def apply_func(func, kwarg_dict): 
    return func(**kwarg_dict) 

या किसी भिन्न रूप उसके कुछ होगा।

उत्तर

17

मुझे लगता है कि do.call वह है जिसे आप ढूंढ रहे हैं। आप इसके बारे में ?do.call के माध्यम से पढ़ सकते हैं।

कैसे लोगों do.call का उपयोग की क्लासिक उदाहरण rbind डेटा फ्रेम करने के लिए है या एक साथ matrices:

d1 <- data.frame(x = 1:5,y = letters[1:5]) 
d2 <- data.frame(x = 6:10,y = letters[6:10]) 

do.call(rbind,list(d1,d2)) 

यहाँ एक और काफी तुच्छ उदाहरण sum का उपयोग कर रहा है:

do.call(sum,list(1:5,runif(10))) 
+0

बिल्कुल। धन्यवाद! पहले पोस्ट करने के लिए – kjo

+0

+1 ... – Andrie

8

आर कार्यों के रूप में पारित किया जा करने की अनुमति देता कार्यों के लिए तर्क। इसका मतलब यह है इस प्रकार के रूप में आप apply.func परिभाषित कर सकते हैं (जहां f एक समारोह है और ... अन्य सभी मापदंडों को इंगित करता है:

apply.func <- function(f, ...)f(...) 

फिर आप को apply.func का उपयोग करें और जहां मानकों समझ में आता है किसी भी समारोह को निर्दिष्ट कर सकते हैं:

apply.func(paste, 1, 2, 3) 
[1] "1 2 3" 

apply.func(sum, 1, 2, 3) 
[1] 6 

हालांकि, ध्यान दें कि निम्नलिखित उम्मीदों का उत्पादन नहीं कर सकते हैं, क्योंकि mean एक वेक्टर को तर्क के रूप में लेता है:

apply.func(mean, 1, 2, 3) 
[1] 1 

ध्यान दें कि do.call नामक बेस आर फ़ंक्शन भी है जो प्रभावी रूप से वही काम करता है।

+2

'f <- match.fun (f) 'फ़ंक्शन तर्क मौजूद है या नहीं, तो सैनिटी जांच होगी। – Marek

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