2012-08-05 6 views
6

मैं एक द्विआधारी ऑपरेटर समारोह आर (यानी एक के लिए %X% की तरह एक नाम के साथ इतना है कि बजाय टाइप करने के लिए %X%(a,b) मैं और अधिक सुविधाजनक वाक्य रचना a %X% b उपयोग कर सकते हैं होने के लिए लिखा था। मेरा लक्ष्य है कि लॉग की तरह काम करता है <- के लिए एक आवरण है क्या कि वातावरण में वस्तुओं के लिए किया जाता है और एक 'सुरक्षित' विशेषता है जो उस वस्तु को अधिलेखित करने से पहले उपयोगकर्ता को चेतावनी दी हैं के लिए जाँच की गई थी।आर में, एक बाइनरी ऑपरेटर के sys.call() में पूरी कमांड लाइन कैसे प्राप्त करें?

यह सब काम करता है, सिवाय इसके कि अगर मैं समारोह सब आप देख अंदर a %X% b + c की तरह कुछ करते हो कोशिश a %X% b _and यह सब कुछ भी करता है; बी और सी के मान को आवंटित किया जाता है पूरी तरह से अनदेखा किया जाता है। a %X% (b + c) काम करता है और %X%(a, b + c) करता है लेकिन इसे अब लिखने का पूरा बिंदु इनरी ऑपरेटर कोष्ठक से बचने के लिए है।

यदि मैं <- को ओवरराइट करता हूं, तो इसका sys.call() सबकुछ बाएं और दाएं को देखता है। मुझे केवल कमांड लाइन से आसन्न नाम क्यों दिखते हैं?

यहाँ कोड है कि इस समस्या को दोहराता है:

`%X%` <- function(...){ 
    print(deparse(sys.call())); 
} 

a %X% 3 + 1:10; 

वांछित परिणाम है "एक% एक्स% 3 + 01:10" मनाया परिणाम है "एक% एक्स% 3"

धन्यवाद।

+1

विषम; जब मैं कोड चलाता हूं (आर 2.15.1) मुझे '% X% 3 + 1:10 में त्रुटि मिलती है: बाइनरी ऑपरेटर के लिए गैर-संख्यात्मक तर्क' –

+0

@ डेविड रॉबिन्सन, त्रुटि का प्रयास करते समय त्रुटि '+' ऑपरेटर से होती है टाइप वर्ण के '1: 10' के साथ संख्यात्मक प्रकार के'% X% 3' के आउटपुट को योग करें। – flodel

उत्तर

2

मुझे लगता है कि एक कस्टम ऑपरेटर की प्राथमिकता को कम करने का कोई तरीका नहीं है। हालांकि, मुझे लगता है कि मैं एक घटिया वैकल्पिक हल मिल गया: मैं अपने ऑपरेटर<<-

नाम कर सकते हैं मैं वास्तव में समझ में नहीं आता कि कैसे <- भेजने का काम करता है, और वहाँ <- (जिनमें से कोई भी वस्तु के विभिन्न विशिष्ट तरीकों के लिए दर्जनों होना चाहिए में methods( < दिखाने -।।

हालांकि ) सभी मुझे पता है कि जब मैं <- सामान टूट जाता है के सभी प्रकार ओवरराइड है, <<- एक पूर्वता <- की है कि के करीब है, और यह क्योंकि कभी-कभी इस मामले में जहां के लिए विशेष रूप से उपयोगी नहीं है आपको वास्तव में करने की ज़रूरत है फ़ंक्शन या लूप के अंदर से ग्लोबल वैरिएबल लिखें, आप केवल .GlobalEnv[['foo']] <- bar या assign('foo',bar,env=.GlobalEnv) का उपयोग कर सकते हैं।

इसके अलावा, चूंकि मैं केवल पहली बार WebobalEnv में ऑब्जेक्ट्स को लॉग और लिखने की कोशिश कर रहा हूं, नया अर्थ जो मैं <<- को असाइन कर रहा हूं वह मूल के साथ कुछ हद तक संगत है।

6

इसे ऑपरेटर प्राथमिकता के साथ करना है, अधिक सहायता के लिए ?Syntax देखें। यह कहता है कि विशेष ऑपरेटर (%any%) जिसकी आप परिभाषित करने की कोशिश कर रहे हैं, बाइनरी + की तुलना में अधिक प्राथमिकता है, इसलिए आपके लिए ब्रांडेसिस का उपयोग करने और a %X% (b + c) करने के लिए कोई अन्य तरीका नहीं है (AFAIK)।

+0

जिज्ञासा से बाहर: फिर <-'/'=' कैसे काम करता है? मैं इसे लेता हूं यह एक बाइनरी ऑपरेटर नहीं है –

+0

@ डेविड रॉबिन्सन, '<-' और '=' बाइनरी ऑपरेटरों हैं, बहुत कम प्राथमिकता के साथ, 'सिंटेक्स' देखें। – flodel

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