2012-06-27 13 views
5

मेरी .Rprofile में से कुछ समाप्त होने पर मुझे निम्नांकित दो पंक्तियों मेरी .Firstdata.table के टेबल() फ़ंक्शन मेरी .Rprofile कार्यों

makeActiveBinding(".refresh", function() { system("R"); q("no") }, .GlobalEnv) 
makeActiveBinding('.rm', function() {rm(list=ls(envir = .GlobalEnv),envir=.GlobalEnv); gc()}, .GlobalEnv) 

में परिभाषित किया है वे आमतौर पर हानिरहित हैं, जब तक कि मैं उन्हें दुर्घटना से टाइप ! पहला .refresh फ़ंक्शन बनाता है जो आर सत्र को छोड़ देगा और पुनरारंभ करेगा। दूसरा वैश्विक पर्यावरण खाली करता है। हालांकि, data.table से tables() फ़ंक्शन का उपयोग करते समय ये दो फ़ंक्शन चलाए जाते हैं जो वास्तव में वांछनीय नहीं हैं।

इस पल के लिए, मैंने उन्हें अपने .First से हटा दिया है, लेकिन अगर मैं इससे बचने का कोई तरीका हूं तो मैं उत्सुक हूं। tables() समारोह में उल्लंघन करने पंक्तियां हैं:

tt = objects(envir = env, all.names = TRUE) 
ss = which(as.logical(sapply(tt, function(x) is.data.table(get(x, 
    envir = env))))) 

उत्तर

8

मुझे लगता है कि तुम सिर्फ है कि रास्ते में सक्रिय बाइंडिंग का उपयोग कर के लिए एक नकारात्मक पक्ष यह है की खोज की। आप सामान्य कार्यों को .rm और .refresh क्यों नहीं बनाते हैं, जिसे आप सामान्य तरीके से कॉल करते हैं (यानी .rm() और .refresh()), और सरल निरीक्षण पर निष्पादित नहीं किया जाएगा?

गया है कि आपकी .First का हिस्सा तो नज़र आ सकते हैं:

.First <- function() { 
    assign(".rm", 
      function() {rm(list=ls(envir=.GlobalEnv), envir=.GlobalEnv)}, 
      pos = .GlobalEnv) 
} 

## Try it out 
j <- 1:10 
ls() 
.First() 
.rm() 
ls() 

संपादित करें, समाधान के साथ:

आगे सोचा पर, यह काम करने के लिए, केवल कोर बिट्स को क्रियान्वित करने लगता है जब .rm सीधे 'बुलाया जाता है'। यह कॉल स्टैक की लंबाई का निरीक्षण करके काम करता है, और केवल rm(...) चला रहा है यदि इसमें केवल एक कॉल है (.rm() पर वर्तमान कॉल का प्रतिनिधित्व करता है। को अन्य फ़ंक्शन (उदाहरण के लिए tables()) पर कॉल द्वारा कॉल/स्पर्श किया जाता है। , कॉल स्टैक अब हो जाएगा, और rm() निष्पादित नहीं किया जाएगा .:

makeActiveBinding('.rm', 
       function() { 
        if(length(sys.calls())==1) { 
         rm(list=ls(envir = .GlobalEnv),envir=.GlobalEnv); gc() 
         } 
       }, 
       .GlobalEnv) 

## Try _it_ out 
library(data.table) 

j <- 100 
.rm 
ls() 

j <- 100 
tables() 
ls() 
+0

यही कारण है कि कैसे मैं उन्हें शुरू में लिखा था, लेकिन अपनी उंगलियों टाइपिंग से बहुत थक गया मिल गया '()' है कि मैं आग के साथ खेलने का फैसला किया ... – Justin

+0

पर्याप्त मेला। अगर आप उस आग को जारी रखने की कोशिश करते हैं, हालांकि, समय के साथ यह आपको कुछ कीस्ट्रोक से अधिक खर्च कर देगा;) –

+0

वर्तमान वातावरण की जांच करने का कोई तरीका नहीं है टी, या एक पैरामीटर जो कहता है "यह एक इंटरैक्टिव वातावरण है ...", और अपने कार्यों को उस जानकारी का उपयोग यह तय करने के लिए करते हैं कि निष्पादित करना है या नहीं? –

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