2010-10-21 21 views
6

मैं उदाहरण के लिए, एक दो agruments समारोह 'समारोह' का उपयोग कर कार्यों का एक वेक्टर बनाना चाहेंगे इस एक:आर: कार्यों का वेक्टर कैसे बनाएं?

func = function(number, coefficient) { 
    return(coefficient*number) 
} 
यहाँ

कैसे मैं कार्यों का वेक्टर बनाने है:

vector_of_functions = NULL 
for (i in 1:4) { 
vector_of_functions = c(vector_of_functions, 
    function(number) func(number=number, coefficient=i)) 
} 

मेरे मुद्दा यह है कि मेरे वेक्टर लिखने वाले सभी कार्य समान हैं, भले ही वे लूप के माध्यम से अलग-अलग उपयोग करके बनाए गए हों। यह बताता है कि उनका मूल्यांकन अंतिम मूल्यांकन (जो यहां एक वैश्विक चर है) का उपयोग करके किया जाता है।

किसी के पास कोई विचार है? हालांकि मैं दृढ़ता से आप इस संरचना का उपयोग नहीं करने सलाह

धन्यवाद

+0

मैं यहां जारी रहता हूं क्योंकि मैं नया उपयोगकर्ता हूं और फोरम मेरे प्रश्न को अवरुद्ध करता है यदि इसमें स्पष्ट रूप से कोड की कई पंक्तियां हैं .... – RockScience

+0

आपके पास कितने कोड हैं? हमारे जवाब देने के लिए यह महत्वपूर्ण है। –

+0

मेरे पास कोड की 11 लाइनें हैं ... – RockScience

उत्तर

3

यह एक eval-पार्स निर्माण का उपयोग कर हल किया जा सकता। यह अक्सर किसी और चीज की तुलना में अधिक समस्याएं पैदा करता है। लेकिन मैं इसे करने का एक सभ्य काम नहीं कर सका।

vector_of_functions = NULL 
for (i in 1:4) { 
vector_of_functions = c(vector_of_functions, 
    eval(parse(text=paste("function(number) func(number=number, coefficient=",i,")")))) 
} 

कारण हारून समझाया गया है: फ़ंक्शन परिभाषा के भीतर सब कुछ फ़ंक्शन मूल्यांकन तक लिया जाता है।

छोटी टिप्पणी: यह विशेष रूप से सूची कार्यों का है, न कि वेक्टर। "फ़ंक्शन" प्रकार का वेक्टर होना असंभव है। यह भी बिल्कुल बेकार है, क्योंकि आपको इसका उपयोग करने से पहले इंडेक्स [[]] का उपयोग करके फ़ंक्शन का चयन करना होगा। फिर मैं तर्कों में से प्रत्येक के संभावित मूल्य के लिए फ़ंक्शन को परिभाषित करने के बजाय तर्क जोड़ दूंगा।

तो तुम क्या हासिल करना चाहते स्पष्ट नहीं है, लेकिन अगर आप विभिन्न गुणांक के साथ समारोह लागू करना चाहते हैं, मुझे आश्चर्य है कि क्यों आप बस नहीं करते हैं:

> x <- c(10,20,30) 
> sapply(1:4,function(y)func(number=x,coefficient=y)) 
    [,1] [,2] [,3] [,4] 
[1,] 10 20 30 40 
[2,] 20 40 60 80 
[3,] 30 60 90 120 

द्वारा विषय पर एक बदलाव मारेक (पार्स परहेज):

vector_of_functions = NULL 
for (i in 1:4) { 
vector_of_functions = c(vector_of_functions, 
    eval(substitute(function(number) func(number=number, coefficient=i),list(i=i)))) 
} 

1L आदि आप मिलता है, बस से संकेत मिलता है कि वे सटीक पूर्णांक हो (कि कम स्मृति अंतरिक्ष लेने के लिए)।

+1

'पार्स के बजाय (टेक्स्ट ('चीज बेहतर उपयोग' विकल्प ':' eval (विकल्प (फ़ंक्शन (संख्या) func (संख्या = संख्या, गुणांक = i), सूची (i = i))) – Marek

+1

वैसे भी यह सूची है इसलिए लूप में लाइन को बदला जा सकता है: vector_of_functions [[i]] = eval (विकल्प (फ़ंक्शन (संख्या) func (संख्या = संख्या, गुणांक = i), सूची (i = i))) –

4

आप i के मूल्य को अपने स्वयं के स्थानीय वातावरण में आसानी से i को फिर से परिभाषित करके "संलग्न" कर सकते हैं (आसानी से फ़ंक्शन द्वारा बनाए गए, local आर में)। "संलग्न" डेटा वाले परिणामस्वरूप फ़ंक्शन को 'बंद' कहा जाता है।

> vector_of_functions = NULL 
> for (i in 1:4) { 
+ vector_of_functions = c(vector_of_functions, 
+  local({i <- i;function(number) func(number=number, coefficient=i)})) 
+ } 
> vector_of_functions[[1]](1) 
[1] 1 
> vector_of_functions[[2]](1) 
[1] 2 
> vector_of_functions[[3]](1) 
[1] 3 
> vector_of_functions[[4]](1) 
[1] 4 
2

समस्या इसलिए जब आप फ़ंक्शन को कॉल यह पिछले मान का उपयोग करता, कारण आलसी मूल्यांकन करने के लिए, 'मैं' चर हर कदम पर evaluted नहीं जा रहा है। इस तरह के मामलों में मूल्यांकन को मजबूर करने के लिए बल समारोह बनाया गया था (इसके लिए सहायता पृष्ठ पर एक उदाहरण है जो आपके प्रश्न के समान है)।

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