2012-11-02 31 views
17

कुछ सरल आदेशों के लिए कोष्ठक का उपयोग करने से बचने के लिए मेरी निरंतर खोज में, मैंने एक नई ग्राफिक्स विंडो बनाने के लिए निम्न ऑपरेटर लिखा है। मेरा सवाल है: क्या मुझे अपने चर "newdev" ​​पर "नहीं" फ़ंक्शन निष्पादित करने में स्पष्ट अक्षमता के अलावा, आर में कुछ भी "तोड़ने" का खतरा है?आर यूनरी ऑपरेटर अधिभार: जोखिम?

# function to overload "!" for one purpose only 
#this is adapted from the sos package code for "???", credited to Duncan Murdoch. 
# Example of how to create a specialized unary operator that doesn't require 
# parentheses for its argument. So far as I can tell, 
#the only way to do this is to overload an existing function or 
# operator which doesn't require parentheses. "?" and "!" meet this requirement. 
`!` <- function (e1, e2) { 
call <- match.call() 
# match.call breaks out each callable function in argument list (which was "??foo" for the sos package "???", 
# which allows topicExpr1 to become a list variable w/ callable function "!" (or "?" in sos) 
original <- function() { 
    call[[1]]<-quote(base::`!`) 
    return(eval(call, parent.frame(2))) 
} 

    # this does preclude my ever having an actual 
    # variable called "newdev" (or at least trying to create the actual NOT of it) 
if(call[[2]] =='newdev') { 
    windows(4.5,4.5,restoreConsole=T) 
}else{ 
    return(original()) # do what "!" is supposed to do 
} 
} 
+0

क्या आप सीधे इन कमांड प्रॉम्प्ट का उपयोग कमांड प्रॉम्प्ट पर कर रहे हैं (यानी, उन्हें फ़ंक्शंस या व्हाट्नॉट में एम्बेड नहीं करना)? यदि ऐसा है, तो आप एक नई कक्षा बना सकते हैं और उस वर्ग के लिए एक प्रिंट विधि परिभाषित कर सकते हैं जो आप चाहते थे। – BenBarnes

+0

मुझे लगता है कि एक अच्छा मौका है कि मैं इन आदेशों को किसी फ़ंक्शन के अंदर कॉल करूंगा, अगर मैं चार्ट का संग्रह बनाना चाहता हूं, उदा। –

उत्तर

4

मैं "!" = function(a){stop("'NOT' is used")} मार डाला और replications समारोह है, जो का उपयोग करता है निष्पादित! ऑपरेटर, और यह ठीक काम किया। तो ऐसा लगता है कि "!" ओवरराइड करना सुरक्षित है।

फिर भी आप शायद इस प्रकार कक्षाएं, जो आप कर सकते हैं का उपयोग करना चाहते:

# Create your object and set the class 
A = 42 
class(A) = c("my_class") 

# override ! for my_class 
"!.my_class" = function(v){ 
    cat("Do wathever you want here. Argument =",v,"\n") 
} 

# Test ! on A 
!A 
+0

अच्छा बिंदु, हालांकि यह मेरे इच्छित उद्देश्य के लिए काम नहीं करेगा, जो एक विशेष बंद करने के लिए किया गया था जिसके बाद तर्क (")" टाइप किए बिना तर्क की आवश्यकता नहीं होती है। एक उदाहरण के रूप में, 'ls()' के बजाय '! Ls'। और, हाँ, मैं उस तरह आलसी हूँ :-)। (याद रखें, 'आर' में डिफ़ॉल्ट बीहाइवर यदि आप केवल बंद करने का नाम टाइप करते हैं तो कंसोल पर क्लोजर कोड प्रिंट करना है) –

+3

इसमें जोड़ने के लिए: कार्यों को अंतःक्रियात्मक रूप से परिभाषित किया गया है या आपके '.profofile' में globalenv () '- पैकेज में कार्य उन्हें नहीं देख सकते हैं। लेकिन, आपके किसी भी * अन्य * कार्यों में आपके 'आरप्रोफाइल' में हो सकता है। – Owen

1

साथ

makeActiveBinding 

आप ls() जैसे लोकसभा द्वारा डब्ल्यू की जगह ले सकता/एकल ऑपरेटरों की जरूरत ओ

+0

यह एक अच्छा मुद्दा है, और वास्तव में मैं कुछ "quickie" कार्यों के लिए उपयोग करता हूं। मैंने अभी पोस्ट की गई विधि को पसंद करना समाप्त कर दिया क्योंकि मैं इसे 'स्विच' फ़ंक्शन के साथ फिर से लिखता हूं - पैकेज 'cgwtools' में' splatnd' के लिए स्रोत कोड देखें। –

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