2012-03-22 16 views
11

मेरे पास एक पैकेज है जिसे मैंने आर सीखते समय लिखा था और इसकी निर्भरता सूची काफी लंबी है। मैं, इसे नीचे ट्रिम करने के लिए दो मामलों के लिए कोशिश कर रहा हूँ:पैकेज निर्भरताओं के लिए सभी मौजूदा कार्यों को खोजें?

  1. मैं अन्य तरीकों का प्रयोग किया, और Suggests में सूचीबद्ध संकुल बस सभी में उपयोग नहीं किया जाता।
  2. केवल एक समारोह मेरे पूरे पैकेज से बाहर किसी दिए गए निर्भरता पर निर्भर करता है, और मैं एक दृष्टिकोण करने के लिए स्विच करने के लिए जहां यह loaded only when needed.

है करना चाहते हैं वहाँ इन दो मामलों को ट्रैक करने के लिए एक स्वचालित तरीका है? मैं दो कच्चे दृष्टिकोण के बारे में सोच सकता हूं (सभी निर्भर पैकेजों में कार्यों की सूची डाउनलोड कर सकता हूं और अपने पैकेज के कोड के माध्यम से उनके लिए एक टेक्स्ट खोज स्वचालित कर सकता हूं, या आवश्यक संकुल लोड किए बिना पैकेज फ़ंक्शंस लोड कर सकता हूं और त्रुटि होने तक निष्पादित कर सकता हूं), लेकिन न तो विशेष रूप से सुरुचिपूर्ण या मूर्खतापूर्ण लगता है ....

+1

मुझे यह भी जानना अच्छा लगेगा! आप पूरी निर्भरता सूची को हमेशा खींच सकते हैं और 'आर सीएमडी चेक' चला सकते हैं यह देखने के लिए कि "अस्थिर निर्भरता" क्या शिकायत करती है, लेकिन यह आदर्श नहीं है। –

+0

मुझे संदेह है कि मैं ऐसा कुछ कर दूंगा, लेकिन एक और अधिक सुरुचिपूर्ण समाधान के लिए आशा रखूंगा :-) –

+2

फ़ंक्शन निर्भरता की जांच करने का एक त्वरित तरीका बाइट को संकलित करना है क्योंकि यदि आप आदेशों के लिए नामस्थान नहीं देते हैं पैकेज से आओ यह शिकायत करेगा कि यह वैश्विक दायरे में उपलब्ध नहीं है। – Hansi

उत्तर

1

सभी कार्यों में निर्भरता की जांच करने का एक तरीका बाइट कंपाइलर का उपयोग करना है क्योंकि यह वैश्विक कार्यक्षेत्र में उपलब्ध कार्यों के लिए जांच करेगा और यदि नोटिस नहीं मिलता है तो नोटिस जारी करें ।

तो अगर आप एक उदाहरण के रूप में अपने कार्यों में से किसी में चिड़ियाघर पैकेज से na.locf फ़ंक्शन का उपयोग करें और फिर बाइट अपने समारोह संकलन आप इस प्रकार का संदेश प्राप्त होगा:

Note: no visible global function definition for 'na.locf' 

सही ढंग से यह पता करने के लिए बाइट संकलन के लिए आपको इसे zoo :: na.locf

तो लाइब्रेरी/पैकेज में सभी आर कार्यों का परीक्षण करने का एक त्वरित तरीका आप ऐसा कुछ कर सकते हैं (माना जाता है कि आपने कॉल नहीं लिखा है नामस्थान के साथ अन्य कार्य):

कार्यों के साथ अपने अनुसंधान फ़ाइलों मान लिया जाये कि सी में कर रहे हैं: \ SomeLibrary \ या के वहाँ और फिर उप-फ़ोल्डर आप सी के रूप में एक sourceing फ़ाइल को परिभाषित: \ SomeLibrary.r या इसी तरह युक्त

if (!(as.numeric(R.Version()$major) >=2 && as.numeric(R.Version()$minor) >= 14.0)) { 
     stop("SomeLibrary needs version 2.14.0 or greater.") 
} 

if ("SomeLibrary" %in% search()) { 
     detach("SomeLibrary") 
} 

currentlyInWorkspace <- ls() 

SomeLibrary <- new.env(parent=globalenv()) 

require("compiler",quietly=TRUE) 

pathToLoad <- "C:/SomeLibraryFiles" 

filesToSource <- file.path(pathToLoad,dir(pathToLoad,recursive=TRUE)[grepl(".*[\\.R|\\.r].*",dir(pathToLoad,recursive=TRUE))]) 

for (filename in filesToSource) { 

     tryCatch({ 
       suppressWarnings(sys.source(filename, envir=SomeLibrary)) 
     },error=function(ex) { 
       cat("Failed to source: ",filename,"\n") 
       print(ex) 
     }) 
} 

for(SomeLibraryFunction in ls(SomeLibrary)) { 
     if (class(get(SomeLibraryFunction,envir=SomeLibrary))=="function") { 
       outText <- capture.output(with(SomeLibrary,assign(SomeLibraryFunction,cmpfun(get(SomeLibraryFunction))))) 
       if(length(outText)>0){ 
         cat("The function ",SomeLibraryFunction," produced the following compile note(s):\n") 
         cat(outText,sep="\n") 
         cat("\n") 
       } 
     } 
} 

attach(SomeLibrary) 

rm(list=ls()[!ls() %in% currentlyInWorkspace]) 

invisible(gc(verbose=FALSE,reset=TRUE)) 

तो कोई प्रीलोडेड साथ आर शुरू संकुल और सी में स्रोत: \ SomeLibrary.r

और एक पैकेज है कि आधार संकुल का हिस्सा नहीं है और पूरी तरह से योग्य नाम स्थान में परिभाषित नहीं है में एक समारोह के लिए किसी भी कॉल के लिए cmpfun से नोट्स तो आप मिलना चाहिए।

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