2012-01-17 25 views
29

मैं devtools, testthat, और roxygen2 का उपयोग कर आर पैकेज विकसित करने पर काम कर रहा हूं। मेरे पास डेटा फ़ोल्डर (foo.txt और bar.csv) में कुछ डेटा सेट हैं।क्या टेस्टथैट परीक्षण या run_examples() में आर पैकेज डेटा का उपयोग करना संभव है?

मेरे फ़ाइल संरचना इस तरह दिखता है:

#' Foo data 
    #' 
    #' Sample foo data 
    #' 
    #' @name foo 
    #' @docType data 
    NULL 
    #' Bar data 
    #' 
    #' Sample bar data 
    #' 
    #' @name bar 
    #' @docType data 
    NULL 

मैं में 'डेटा का उपयोग करना चाहते हैं:

/ mypackage 
    /data 
     * foo.txt, bar.csv 
    /inst 
     /tests 
      * run-all.R, test_1.R 
    /man 
    /R 

मैं यकीन है कि' foo 'और' बार 'सही ढंग से प्रलेखित कर रहा हूँ मेरे प्रलेखन उदाहरणों और यूनिट परीक्षणों में foo 'और' bar '।

उदाहरण के लिए, मैं फोन करके मेरी testthat परीक्षण में इन डेटा सेट उपयोग करना चाहते हैं:

data(foo) 
    data(bar) 
    expect_that(foo$col[1], equals(bar$col[1])) 

और, मैं इस तरह देखने के लिए दस्तावेज में उदाहरण चाहते हैं:

#' @examples 
    #' data(foo) 
    #' functionThatUsesFoo(foo) 

यदि मैं पैकेज को विकसित करते समय डेटा (foo) को कॉल करने का प्रयास करता हूं, तो मुझे त्रुटि "डेटा सेट 'foo' नहीं मिला" मिलता है। हालांकि, अगर मैं पैकेज बनाता हूं, इसे इंस्टॉल करता हूं, और इसे लोड करता हूं - तो मैं परीक्षण और उदाहरण काम कर सकता हूं।

foo <- read.delim(pathToFoo, sep="\t", fill = TRUE, comment.char="#") 
    bar <- read.delim(pathToBar, sep=";", fill = TRUE, comment.char="#" 
    expect_that(foo$col[1], equals(bar$col[1])) 

यह:

#' @examples 
    #' \dontrun{data(foo)} 
    #' \dontrun{functionThatUsesFoo(foo)} 

और परीक्षणों में, एक रास्ता अपने स्थानीय कंप्यूटर के लिए विशिष्ट का उपयोग कर डेटा पूर्व लोड:

मेरे वर्तमान कार्य arounds उदाहरण नहीं चलाने के लिए कर रहे हैं आदर्श प्रतीत नहीं होता - खासकर जब से मैं दूसरों के साथ सहयोग कर रहा हूं - सभी सहयोगियों को 'foo' और 'bar' के समान पथ रखने की आवश्यकता होती है। इसके अलावा, प्रलेखन में उदाहरण दिखते हैं कि वे नहीं चल सकते हैं, भले ही पैकेज स्थापित हो, वे कर सकते हैं।

कोई सुझाव? बहुत धन्यवाद।

+1

डेटा() का उपयोग न करें। आलसी लोडिंग पर भरोसा करें। – hadley

+0

उस अंतिम टिप्पणी के बारे में क्षमा करें, मैं अभी भी इस स्वरूपण के लिए उपयोग कर रहा हूं। धन्यवाद @ हैडली। इससे टेस्टथैट परीक्षणों में मदद मिली। मुझे अभी भी एक नुकसान हुआ है कि दस्तावेज में एक उदाहरण कैसे बनाया जाए (roxygen2 का उपयोग करके) जो मुझे डेटा सेट का लाभ लेने देता है। – JPMac

+2

यदि आप डेटा को '.Rdata' फ़ाइलों में कनवर्ट करते हैं, तो' load_all' आपके लिए लोड करेगा। – hadley

उत्तर

17

उदाहरण के भीतर गैर rdata फ़ाइलें आयात/

मैं झाँक रहा द्वारा इस समस्या का समाधान मिल गया the JSONIO package, जो स्पष्ट रूप से .RData किस्म की तुलना में अन्य फ़ाइलों को पढ़ने के कुछ उदाहरण उपलब्ध कराने की जरूरत पर परीक्षण करती है।

मुझे यह कार्य-स्तर के उदाहरणों में काम करने के लिए मिला है, और R CMD check mypackage और testthat::test_package() दोनों को संतुष्ट करता है।

(1) अपनी पैकेज संरचना को फिर से व्यवस्थित करें ताकि उदाहरण डेटा निर्देशिका inst के भीतर हो। किसी बिंदु पर R CMD check mypackage ने मुझे गैर-आरडीएटा डेटा फ़ाइलों को inst/extdata पर स्थानांतरित करने के लिए कहा, इसलिए इस नई संरचना में इसका नाम बदल दिया गया।

/ mypackage 
    /inst 
     /tests 
      * run-all.R, test_1.R 
     /extdata 
      * foo.txt, bar.csv 
    /man 
    /R 
    /tests 
     * run-testthat-mypackage.R 

(2) (वैकल्पिक) एक शीर्ष स्तर tests निर्देशिका ताकि अपने नए testthat परीक्षण अब भी R CMD check mypackage दौरान चलाए जा रहे हैं जोड़ें।

run-testthat-mypackage.R स्क्रिप्ट कम से कम निम्नलिखित दो लाइनों होना चाहिए:

library("testthat") 
test_package("mypackage") 

ध्यान दें कि यह बात यह है कि testthat R CMD check mypackage दौरान कहा जा करने की अनुमति देता है, और आवश्यक अन्यथा नहीं। आपको testthat को अपनी DESCRIPTION फ़ाइल में "Suggests:" निर्भरता के रूप में भी जोड़ना चाहिए।

(3) अंत में, अपने भीतर-पैकेज पथ निर्दिष्ट करने के लिए गुप्त-चटनी:

barfile <- system.file("extdata", "bar.csv", package="mypackage") 
bar <- read.csv(barfile) 
# remainder of example/test code here... 

आप system.file() आदेश के उत्पादन को देखें, तो यह के भीतर अपने पैकेज के लिए पूरा सिस्टम पथ लौटा रहा है आर ढांचा। मैक ओएस एक्स पर इस तरह दिखता है:

"/Library/Frameworks/R.framework/Versions/2.15/Resources/library/mypackage/extdata/bar.csv" 

कारण यह मेरे लिए ठीक लग रहा है कि आप मुश्किल नहीं कोड किसी भी पथ अपने पैकेज के भीतर के अलावा अन्य सुविधाओं करना है, इसलिए इस दृष्टिकोण दूसरे से मजबूत रिश्तेदार होना चाहिए अन्य प्रणालियों पर आर प्रतिष्ठानों।

data() दृष्टिकोण

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

+0

गहन उत्तर के लिए धन्यवाद! – JPMac

+0

आपका स्वागत है। मुझे खुशी है कि यह मदद की। यह मेरे अपने पैकेज डेवेल के लिए उपयोगी हो गया है, इसलिए मैं साझा करना चाहता था। –

+0

मैं यह पता लगाने की कोशिश कर रहा हूं कि "आयात की अपस्ट्रीम प्रक्रिया" को पुन: उत्पन्न करने के तरीके को कैसे बनाया जाए। मेरे पास एक सामान्य उपयोग मामला यह है कि मैं कुछ आकारफाइलों के परिवर्तन के साथ काम करना चाहता हूं जो तुच्छ नहीं है --- शायद इसमें एक मिनट लग सकता है। मैं 'inst/extdata' में आकारफाइल शामिल कर सकता हूं, लेकिन मुझे लगता है कि' इंस्टॉल() 'के अंदर कोड निष्पादन से उस पथ को कभी नहीं मिल रहा है। इसके अलावा, यहां तक ​​कि 'दस्तावेज़()' 'डेटा 'के अंदर सभी' .r' फ़ाइलों को पुनर्निर्माण करना चाहता है। जब भी मैं किसी फ़ंक्शन के लिए दस्तावेज़ जोड़ता या बदलता हूं, तो मैं उन्हें पुनर्निर्माण नहीं करना चाहता हूं। एक 'डेटा/मेकफ़ाइल' लेकिन यह कट्टरपंथी लगता है। टिप्स की सराहना की! – dholstius

2

प्रति @ हैडली की टिप्पणी, .RData रूपांतरण अच्छी तरह से काम करेगा।

टीम के सदस्यों के विभिन्न वातावरण के साथ टीम सहयोग के व्यापक प्रश्न के लिए, एक सामान्य पैटर्न एक पर्यावरण चर पर सहमत होना है, उदाहरण के लिए, FOO_PROJECT_ROOT, कि टीम में हर कोई अपने पर्यावरण में उचित रूप से स्थापित होगा। उस बिंदु से आप परियोजनाओं सहित सापेक्ष पथ का उपयोग कर सकते हैं।

एक आर-विशिष्ट दृष्टिकोण कुछ डेटा/कार्यों पर सहमत होना होगा कि प्रत्येक टीम सदस्य .Rprofile फ़ाइलों में स्थापित होगा। उदाहरण के लिए, devtools गैर-मानक स्थानों में पैकेज कैसे पाता है।

अंतिम लेकिन कम से कम नहीं, हालांकि यह इष्टतम नहीं है, लेकिन आप वास्तव में अपने भंडार में डेवलपर-विशिष्ट कोड डाल सकते हैं। अगर @ हैडली करता है, तो यह इतनी बुरी चीज नहीं है। उदाहरण के लिए, उदाहरण के लिए, activates certain behaviorstestthat में अपने पर्यावरण में कैसे देखें।

+0

यह भी बहुत अच्छी जानकारी है, बहुत धन्यवाद। – JPMac