2012-01-16 34 views
5

में अनुकरण की S3 और S4 तरीकों का उपयोग कर मैं त्रुटिआर एक ही पैकेज

found an S4 version of 'simulate' so it has not been imported correctly 

मैं एक आर पैकेज है कि एक S3 पद्धति के रूप में एक अनुकरण() विधि के लिए एक परिभाषा शामिल लिखा है से हैरान हूँ। चूंकि अनुकरण के लिए सामान्य पहले ही परिभाषित किया गया है, इसलिए मैं बस एक simulate.myclass (simulate.fitContinuous मेरे मामले में) परिभाषित करता हूं।

पैकेज यह भी एक अन्य पैकेज पर निर्भर करता है जिसमें अनुकरण का एस 4 संस्करण है। मेरे पैकेज को लोड करते समय, मुझे उपरोक्त एस 4 संस्करण त्रुटि मिलती है। मुझे यकीन नहीं है कि त्रुटि का उत्पादन क्या हो रहा है। package from github, या हथियाने द्वारा

प्रतिलिपि प्रस्तुत करने योग्य उदाहरण

require(devtools) 
install_github("pmc", "cboettig") 
require(pmc) 

खरोंच से इस त्रुटि पुन: पेश करने के लिए कार्य करें: कम से कम वर्णन फ़ाइल से एक नया पैकेज बनाएँ। विवरण आयात शामिल करें: आउच। एक NAMESPACE बनाएं और आयात (ouch) और S3method (अनुकरण, परीक्षण) जोड़ें। आर निर्देशिका बनाएँ, एक छोटी सी आर स्क्रिप्ट जोड़ने (मैंने सम्मिलित कर दिया roxygen प्रलेखन कि NAMESPACE मैं सिर्फ उल्लेख किया है उत्पन्न होगा, लेकिन इस त्रुटि भी बिना DevTools/roxygen बनाया जा सकता है):

#' simulate 
#' 
#' a test for s3/s4 conflicts 
#' @param object who cares? 
#' @param nsim guess. 
#' @param seed yup 
#' @param ... other parameters we will just ignore 
#' @return something 
#' @method simulate test 
#' @S3method simulate test 
#' @import ouch 
simulate.test <- function(object, nsim = 1, seed = NULL, ...){ 
    message("This test worked") 
} 

स्थापित करें पैकेज (यदि आप चाहें तो devtools के साथ दस्तावेज़), और आपको त्रुटि मिलती है।

मेरा सबसे अच्छा समाधान अब तक NAMESPACE से S3method लाइन को खत्म करना है, और इसके बजाय पूर्ण फ़ंक्शन simulate.test निर्यात करना है। यह बिना किसी चेतावनी के चेक और इंस्टॉल हो जाएगा, लेकिन स्पष्ट रूप से एक निम्न समाधान है।

एक अलग समाधान आउच में निर्भर करता है साथ ही आयात करता है, और S3 विधि को ठीक से (जैसा ऊपर) दस्तावेज करता है। तब सबकुछ अपेक्षित काम करता है, लेकिन चेतावनी संदेश बनी हुई है।

+0

ध्यान दें कि आयात के बजाय निर्भर करता है, और S3method (अनुकरण, परीक्षण) लाइन को रखने से कोई त्रुटि उत्पन्न नहीं होती है, बल्कि यह भी सही व्यवहार उत्पन्न नहीं करती है। – cboettig

उत्तर

4

simulate एक S3 सामान्य stats में परिभाषित किया गया है, इसलिए "लेखन आर एक्सटेंशन" की धारा 1.6.2 के अनुसार (उदाहरण स्पष्ट नहीं है - वहाँ base में परिभाषित जेनरिक के लिए अपवाद हैं) अपने NAMESPACE फ़ाइल

होना चाहिए एक सामान्य कि दिखाई नहीं देती थी S3 ("यह" मुझे लगता है कि करने के लिए एस 4 तरीकों जोड़ने की कोशिश कर सामान्य संदर्भित करता है -
importFrom(stats, simulate) 
S3method(simulate, fitContinuous) 

"एक एस 4 विधि मिला" के बारे में व्यापार को प्रतिबिंबित करने के लिए जब समस्या की खोज की थी लगता है simulate)।

+0

मेरे नामस्थान में आयात किया गया "ouch" पैकेज आंकड़े एक एस 4 विधि बनाता है, जो मुझे यह त्रुटि दे रहा है। Ouch लोड किए बिना showMethods ("अनुकरण") आज़माएं, और आपको बताया जाता है कि यह एक एस 4 विधि नहीं है। लोड पुस्तकालय (आउच); showMethods ("अनुकरण") और फिर अनुकरण अब एक एस 4 विधि है। इस समस्या को हल करने के लिए निश्चित नहीं है, एस 4 त्रुटि संदेश बनी रहती है। – cboettig

+0

मेरा उत्तर गलत लगता है, और मेरे पास तत्काल समाधान नहीं है; गलत जानकारी के लिए खेद है। मैं अनुमान लगाऊंगा कि चुनिंदा आयात करने के लिए ouch (और अनुकरण आयात नहीं), या अनुकरण पर एक एस 4 विधि को परिभाषित करने के लिए, लेकिन उनमें से कोई भी आवश्यक नहीं होना चाहिए, आईएमओ। –

+0

हम्म। आउच पैकेज पहले से ही अनुकरण एस 4 विधि को परिभाषित करता है। मुझे उस पैकेज की अनुकरण विधि का उपयोग करने की आवश्यकता है, इसलिए इसे आयात करना एक विकल्प नहीं है ... – cboettig

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