2015-06-11 6 views
6

मैं वर्तमान में एक आर पैकेज पर काम कर रहा हूं और हैडली विकम द्वारा प्रदान किए गए सर्वोत्तम अभ्यास दिशानिर्देशों का पालन करने की कोशिश कर रहा हूं http://r-pkgs.had.co.nz। इस के हिस्से के रूप में, मैं लक्ष्यीकरण के बजाय विवरण फ़ाइल के आयात खंड के भीतर सभी पैकेज निर्भरताओं का लक्ष्य रख रहा हूं क्योंकि मैं वैश्विक पर्यावरण को अनावश्यक रूप से बदलने के दर्शन के साथ सहमत हूं (कुछ ऐसा है जो कई सीआरएएन और बायोकॉन्डक्टर पैकेज नहीं करते हैं अनुवर्ती प्रतीत नहीं होता है)।किसी अन्य पैकेज से S3 विधियों का उपयोग कैसे करें जो निर्भर करता है कि S3method के बजाय अपने नामस्थान में निर्भर करता है या पुस्तकालय()

मैं अपने पैकेज कार्यों में से एक के भीतर बायोकॉंडक्टर पैकेज rhdf5 के भीतर फ़ंक्शंस का उपयोग करना चाहता हूं, विशेष रूप से h5write()। अब जिस मुद्दे में मैंने भाग लिया है वह यह है कि इसकी एस 3 विधियों को इसके NAMESPACE में घोषित नहीं किया गया है। वे (जैसे)

export(h5write.default) 
export(h5writeDataset.matrix) 

बजाय

S3method(h5write, default) 
S3method(h5writeDataset, matrix) 

सामान्य h5write के रूप में परिभाषित किया गया है का उपयोग करते हुए घोषणा की जाती है:

h5write <- function(obj, file, name, ...) { 
res <- UseMethod("h5write") 
    invisible(res) 
} 

व्यवहार में, इस का मतलब है कि कॉल करने के लिए rhdf5 :: h5write असफल क्योंकि पंजीकृत कोई उचित h5write विधि पंजीकृत नहीं है।

जहां तक ​​मैं देख सकता हूँ, वहाँ इस के लिए तीन समाधान हैं:

  1. उपयोग Depends बजाय Imports वर्णन फ़ाइल में।
  2. प्रासंगिक फ़ंक्शन के लिए कोड में library("rhdf5") या require("rhdf5") का उपयोग करें।
  3. के बजाय S3methods() का उपयोग करने के लिए rhdf5 के लिए NAMESPACE फ़ाइल में संशोधन करें।

इनमें से सभी के नुकसान हैं। विकल्प 1 का अर्थ है कि पैकेज को लोड किया गया है और वैश्विक पर्यावरण से जुड़ा हुआ है भले ही मेरे पैकेज में प्रासंगिक फ़ंक्शन कभी नहीं कहा जाता है। विकल्प 2 का मतलब है पैकेज में library का उपयोग, जो कि फिर से वैश्विक पर्यावरण के लिए पैकेज को जोड़ता है, और प्रति हैडली विकम के दिशानिर्देशों को भी हटा दिया जाता है। विकल्प 3 का मतलब अन्य पैकेज लेखक पर बायोकॉन्डक्टर पर अपने पैकेज को अपडेट करने के लिए निर्भर होना चाहिए और इसका मतलब यह भी है कि एस 3 विधियों को अब निर्यात नहीं किया जाता है जो बदले में अन्य पैकेजों को तोड़ सकता है जो उन्हें स्पष्ट रूप से कॉल करने पर भरोसा करते हैं।

क्या मुझे कोई और विकल्प याद आया है? मैंने स्टैक ओवरफ्लो पर कहीं और देखा है और निम्नलिखित कुछ प्रासंगिक प्रश्न Importing S3 method from another package और How to export S3 method so it is available in namespace? पाया लेकिन कुछ भी नहीं जो सीधे मेरे मुद्दे को संबोधित करता है। ध्यान दें, इन दोनों में से पहला से महत्वपूर्ण अंतर यह है कि जेनेरिक और विधि दोनों एक ही पैकेज में हैं, लेकिन समस्या S3method के बजाय export का उपयोग है। (एक पैकेज बनाने के लिए जरूरत के बिना) त्रुटि पुन: पेश करने

नमूना कोड:

loadNamespace("rhdf5") 
rdhf5::h5write(1:4, "test.h5", "test") 

Error in UseMethod("h5write") : 
no applicable method for 'h5write' applied to an object of class 
"c('integer', 'numeric') 

वैकल्पिक रूप से, वहाँ एक कंकाल पैकेज https://github.com/NikNakk/s3issuedemo पर जो एक एकल समारोह demonstrateIssue() जो त्रुटि संदेश reproduces प्रदान करता है। इसे devtools::install_github("NikNakk/s3issuedemo") का उपयोग करके स्थापित किया जा सकता है।

+0

मुझे यकीन नहीं है कि आपका सटीक प्रश्न क्या है, क्या आप पैकेज विधियों का उपयोग करने की कोशिश कर रहे हैं? क्या आप नई विधियां बनाने की कोशिश कर रहे हैं? आपका उद्देश्य क्या है? आपका प्रश्न विस्तृत है लेकिन यह बहुत स्पष्ट नहीं है। – cdeterman

+0

क्षमा करें अगर मैं स्पष्ट नहीं था। मैं अपने पैकेज में एक फ़ंक्शन के भीतर rhdf5 :: h5write फ़ंक्शन का उपयोग करना चाहता हूं। यदि मैं 'निर्भर करता है' या 'लाइब्रेरी() 'का उपयोग करके वैश्विक वातावरण में rhdf5 पैकेज संलग्न करता हूं तो सब कुछ ठीक काम करता है। यह ठीक काम करता है अगर मैं अन्य पैकेज की NAMESPACE फ़ाइल को 'निर्यात() 'के बजाय' S3method() 'का उपयोग करने के लिए बदलता हूं। लेकिन अन्यथा, यह विफल रहता है। मैंने उपरोक्त मेरे प्रश्न में संशोधन किया है। –

+0

क्या आप एक पुनरुत्पादित उदाहरण प्रदान कर सकते हैं? क्या यह आपका गिटूब पर पैकेज है जहां हम आपका सोर्स कोड देख सकते हैं? – cdeterman

उत्तर

6

यहां कुंजी जो सामान्य आप उपयोग करना चाहते हैं उसके अतिरिक्त विशिष्ट विधियों को आयात करना है।यहां बताया गया है कि आप इसे डिफ़ॉल्ट विधि के लिए कैसे काम कर सकते हैं।

नोट: यह मानता है कि test.h5 फ़ाइल पहले से मौजूद है।

#' @importFrom rhdf5 h5write.default 
#' @importFrom rhdf5 h5write 
#' @export 
myFun <- function(){ 
    h5write(1:4, "test.h5", "test") 
} 

मैं भी अपने खुद के छोटे पैकेज इस here प्रदर्शन प्रस्तुत किया है।

+0

बहुत धन्यवाद। यह समस्या को हल करता है। –

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