आर

2013-03-09 5 views
8

में किसी सूची के साथ तर्क को बदलें, कुछ बार एक ऐसा फ़ंक्शन होता है जिसमें मनमानी संख्याएं होती हैं। उदाहरण के लिए, bootstrapPage पैकेज चमकदार का कार्य। अगर मेरे पास डेटा.फ्रेम है और मैं एक पंक्ति के लिए एक विजेट बनाना चाहता हूं, तो मुझे डेटा.फ्रेम की पंक्ति संख्या के अनुसार तर्कों की संख्या को पारित करने का एक सुंदर तरीका नहीं पता है। अब तक, मैं स्क्रिप्ट उत्पन्न करता हूं और eval(parse(text="..."))आर

वास्तव में, आर (कुंजी और मान) में कार्य करने के लिए पारित तर्कों की संरचना list के समान होती है, इसलिए मुझे आश्चर्य है कि क्या कोई तरीका है

अधिक विशेष रूप से आर में एक सूची के रूप तर्क पारित, अगर मैं एक समारोह f और एक सूची argv है, वहाँ argv और के नाम का मिलान के अनुसार f को argv में वस्तुओं पारित करने के लिए एक रास्ता है f के तर्कों का नाम, और argv में स्थिति और f के तर्कों में स्थिति?

उदाहरण के लिए,

जाने
f <- function(a, b) a + b 
argv <- list(a=1, b=2) 

मैं argvf जो f(a=argv$a, b=argv$b) के बराबर है कैसे पारित करना चाहिए?

या अगर हमने:

f <- function(a, b, ...) { # some codes } 
argv <- list(a = 1, b = 2, 3, 4, 5) 

मैं कैसे पास करना चाहिए argvf जो f(a=argv$a, b=argv$b, argv[[3]], argv[[4]], argv[[5]]) के बराबर है के लिए?

धन्यवाद!

उत्तर

11

आप do.call खोज रहे हैं।

do.call(f, argv) 

यहाँ कुछ उदाहरण

> args <- list(n = 10, mean = 3, sd = .5) 
> do.call(rnorm, args) 
[1] 3.589416 3.393031 2.928506 2.503925 3.316584 2.581787 2.686507 3.178877 
[9] 3.083885 2.821506 
> do.call(rnorm, list(10, 3, .5)) 
[1] 3.964526 2.838760 2.436684 3.068581 1.842332 3.739046 4.050525 3.097042 
[9] 3.665041 3.535947 
> f <- function(a, b) a + b 
> argv <- list(a=1, b=2) 
> do.call(f, argv) 
[1] 3 
> f <- function(a, b, ...){print(a);print(b);print(sum(...))} 
> argv <- list(a=1,b=2, 3, 4, 5) 
> do.call(f, argv) 
[1] 1 
[1] 2 
[1] 12 
+0

उदाहरण के अच्छा संग्रह कर रहे हैं। यह उस भाषा की एक विशेषता है जो वास्तव में "आर के परिचय" में बेहतर उपचार का हकदार है। महान उदाहरणों के लिए –

+2

+1 –