2011-06-19 19 views
26

मैं फ़ंक्शन नाम की किसी दिए गए स्ट्रिंग के साथ फ़ंक्शन को कॉल करने का प्रयास कर रहा हूं।आर में फ़ंक्शन नाम की वर्ण स्ट्रिंग का उपयोग करके फ़ंक्शन को कैसे कॉल करें?

उदा।

print(funcList) 
[[1]] 
`*` 

[[2]] 
sin 

काम करता है:

mult <- `*` 
mult(5,6) 
[1] 30 

काम नहीं करता:

func1 <- funcList[[1]] 
func1(5,6) 

func2 <- funcList[[2]] 
func2(1.2) 

तो यह functionList में सभी कार्यों के कॉल करने के लिए संभव है?

+0

आपका उदाहरण मीटर के लिए काम करता इस्तेमाल कर सकते हैं ई और आपकी सूची के तत्व पात्र नहीं हैं, वे कार्य हैं। उत्तर के लिए –

उत्तर

31

वे तारों की तरह नहीं दिखते हैं; यह कार्यों की एक सूची की तरह दिखता है। अपने शीर्षक में दिए गए प्रश्न का उत्तर देने के लिए, get() देखें। उदाहरण के लिए, अपनी सूची का उपयोग कर के लिए, लेकिन चरित्र तार के रूप में जमा:

funcList <- list("*", "sin") 

हम get() उपयोग कर सकते हैं सूची के चयनित तत्व द्वारा दिए गए नाम के साथ समारोह वापस जाने के लिए:

> f <- get(funcList[[1]]) 
> f 
function (e1, e2) .Primitive("*") 
> f(3,4) 
[1] 12 

एक वैकल्पिक match.fun() है समारोह है, जो दिए गए एक स्ट्रिंग है स्ट्रिंग नाम मिलान के साथ एक समारोह मिलेगा:

> f2 <- match.fun(funcList[[1]]) 
> f2(3,4) 
[1] 12 

लेकिन जैसा कि ?match.fun हमें बताता है, हम शायद उस पर ऐसा नहीं कर रहे हैं, लेकिन एक समारोह के भीतर से।

आप कार्यों की एक सूची है, तो एक बस सूची में सूचकांक और यह एक समारोह के रूप में उपयोग कर सकते हैं:

> funcList2 <- list(`*`, sin) 
> str(funcList2) 
List of 2 
$ :function (e1, e2) 
$ :function (x) 
> funcList2[[1]](3, 4) 
[1] 12 
> funcList2[[2]](1.2) 
[1] 0.9320391 

या आप अंतरिम वस्तुओं के रूप में कार्य को बचा सकता है, लेकिन वहाँ थोड़ा है ऐसा करने में बिंदु:

> f3 <- funcList2[[1]] 
> f3(3,4) 
[1] 12 
> f4 <- funcList2[[2]] 
> f4(1.2) 
[1] 0.9320391 
+0

धन्यवाद। लेकिन आप सही थे .. मेरे पास तारों की एक सूची नहीं है मेरे पास कार्यों की एक सूची है। क्या आप मुझे बता सकते हैं कि कार्यों की सूची के साथ भी ऐसा कैसे करें? – tObi

+0

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

21

do.call के लिए दस्तावेज़ देखें।

एक त्वरित प्रदर्शन:

do.call("rnorm", list(100, 0, 1)) 

पहले पैरामीटर एक स्ट्रिंग शाब्दिक हो सकता है, या आर वस्तु, और दूसरा एक तर्क है कि प्रदान की जाती समारोह औपचारिक तर्क के साथ मिलान किया जा रहे हैं की सूची है।

1

आप भी match.fun

> functionlist <- list("*","sin") 
> f <- match.fun(functionlist[[1]]) 
> f(5,6) 
[1] 30 
संबंधित मुद्दे