2013-03-15 4 views
8

दुर्भाग्य से चीजों की तरह दोनों एकल कार्यों आर में काम नहीं करते इसलिए मैं निम्नलिखित तरीके से एकल कार्यों के लिए "+" ऑपरेटर को ओवरलोड करने की कोशिश की हैं:ऑपरेटर आर में कार्यों के लिए अधिक भार - अजीब व्यवहार <code>(f+g)(3)</code> जहां च और छ

"+.function" = function(e1, e2){ 
    return(function(x) e1(x) + e2(x)) 
} 

लेकिन अगर मैं इसका उपयोग करने की कोशिश करता हूं, तो यह कुछ भी नहीं करता है। के रूप में अगर +.function भी परिभाषित नहीं है कोड

a = function(x) 2*x 
(a+a)(2) 

वही त्रुटि पैदा करता है।

कुछ समय के आसपास मुझे पता चला कि वास्तव में इस तरह से कार्यों को जोड़ने की संभावना है: यदि कार्य संदर्भ वर्ग के सदस्य कार्य हैं, तो यह काम करता है! यानी, निम्नलिखित कोड (ऊपर से "+" परिभाषा के साथ)

clsA = setRefClass("clsA", 
    methods = list(
    b = function(x) 2*x 
)) 

inst_a = clsA$new() 
(inst_a$b + inst_a$b)(2) 

"8" (अपेक्षित के रूप में) लौटाता है। इसलिए मेरे पास मेरी समस्या के लिए पहले से ही कुछ प्रकार का कामकाज है। अब मेरे प्रश्न हैं:

इस अजीब व्यवहार का कारण क्या है? +.function क्यों नहीं है "सामान्य" फ़ंक्शन के बारे में परवाह है लेकिन वर्ग सदस्य कार्य करता है? क्या किसी को यह पता है कि ऑपरेटर को सामान्य कार्यों में "विस्तार" कैसे किया जाता है?

+0

यदि आप कक्षा की कक्षा को फिर से परिभाषित करते हैं, उदाहरण के लिए कक्षा (ए) <- "परीक्षण", और अपना "+। फ़ंक्शन" "+ .test", फिर (ए + ए) (2) काम करता है। तो ऐसा लगता है कि समारोह वर्ग किसी भी तरह विशेष है। –

+0

अच्छा, यह काम करता है :-) ठीक है, कोई भी इसे अभी भी एक कामकाज के रूप में देख सकता है, लेकिन मुझे लगता है कि यह संदर्भ वर्ग के साथ मेरे विचार से कहीं अधिक "चालाक" कामकाज है। इस विचार के लिए बहुत बहुत धन्यवाद! –

उत्तर

5

आप (class(a)<-"ownfunction" की तरह उदाहरण के लिए, a के वर्ग redifine या बेहतर अभी तक class(a)<-c("ownfunction","function"), और अपने "+.function""+.ownfunction" के रूप में करते हैं , तो (a+a)(2) काम करता है।

ऐसा लगता है कि function कक्षा का कुछ विशेष तरीके से इलाज किया जाता है: यदि आप debug("+.function");(a+a)(2) चलाते हैं तो आप देखते हैं कि "+.function" भी नहीं कहा जाता है।

संपादित करें: टिप्पणियां देखें।

+0

आपके विचार के आधार पर: यदि मैं अपने मूल '+। कार्यक्षमता 'ऑपरेटर की तुलना में' वर्ग (ए) <- "फ़ंक्शन" को फिर से परिभाषित करता हूं, तो' ए 'के साथ-साथ कक्षा विधियों के लिए भी काम करता है। मुझे लगता है कि यह सबसे स्मार्ट समाधान होगा। –

+0

@ पैट्रिक यह सच है। मुझे विश्वास है कि ऐसा होता है क्योंकि 'कक्षा (ए) <- "फ़ंक्शन" के बाद, 'ए' में क्लास विशेषता '" फ़ंक्शन "है जो सामान्य कार्य के मामले में नहीं है। हालांकि, दोनों मामलों में 'वर्ग (ए)' रिटर्न '" समारोह "'। – QkuCeHBH

+0

अच्छा, भले ही 'वर्ग' फ़ंक्शन किसी फ़ंक्शन की कक्षा के रूप में 'फ़ंक्शन' प्रदान करता है, यह वास्तव में 'फ़ंक्शन' वर्ग का सदस्य नहीं है :) –

3

समाधान के लिए, आप निर्धारित कर सकते हैं एक special operator (%...%) इस तरह:

"%+%" <- function(e1, e2) { 
    return(function(x) e1(x) + e2(x)) 
} 

a <- function(x) 2*x 
(a %+% a)(2) # == 8 
+0

यह मेरे लिए एक ही त्रुटि उत्पन्न करता है जैसे '+। कार्यक्षमता' 'दृष्टिकोण। –

+0

क्षमा करें, '+ '' '% +%' के साथ प्रतिस्थापित करना भूल गया ... अब इसे – QkuCeHBH

+0

काम करना चाहिए धन्यवाद, यह पहले थोड़ा अजीब लग रहा था, हालांकि मैंने% +% के अर्थ को गलत समझा .. –

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