आर: स्व लिखित पैकेज में मैग्रीट पाइप ऑपरेटर का उपयोग करें


101

मैं पैकेज में %>%पेश किए गए पाइप-ऑपरेटर को magrittrपैकेज dplyrडेटा ट्रांसफॉर्मेशन में खुद को लिखने के लिए उपयोग करना चाहूंगा । फ़ाइल के magrittrरूप Importमें सूचीबद्ध है DESCRIPTION। अपने स्वयं के पैकेज को लोड करने और फ़ंक्शन का परीक्षण करने के बाद जो पाइप-ऑपरेटर का उपयोग करता है मुझे निम्न त्रुटि संदेश मिलता है:

फ़ंक्शननेम में त्रुटि (पैरामीटर:: "%>%" फ़ंक्शन नहीं मिल सका

फंक्शन सोर्स कोड में बदलाव %>%करने magrittr::%>%से मदद नहीं मिलती है क्योंकि पैकेज का निर्माण अब नहीं किया जा सकता है।


4
मैं एक पैकेज के अंदर एक फ़ंक्शन के अंदर पाइप ऑपरेटर के खिलाफ सलाह दूंगा। यह बहुत कठिन डिबगिंग बनाता है (कॉल स्टैक पाइप के साथ पागलपन से गहरा हो जाता है)। उन पैकेजों के लिए, जिन्हें मैं एक अस्थायी चर को अधिलेखित कर दूंगा, जो परीक्षण को बहुत आसान बनाता है (सोचें: आर आपको बता रहा है कि त्रुटि किस रेखा पर हुई)। इंटरैक्टिव उपयोग के लिए पाइप ठीक है लेकिन प्रोग्रामिंग के लिए यह एक बोझ हो सकता है।

जवाबों:


101

यदि आपने magrittrसूचीबद्ध किया था तो इसे सही ढंग से काम करना चाहिए था Depends। हालांकि, यह सलाह नहीं दी गई है । इसके बजाय, आप नीचे छोड़ते magrittrहैं Importsऔर निम्न पंक्ति जोड़ते हैं NAMESPACE:

importFrom(magrittr,"%>%")

मेरा सुझाव है कि लेखन आर एक्सटेंशन पढ़ना । आपका प्रश्न पैराग्राफ 1.1.3 और 1.5.1 में शामिल है।


1
@alexanderketh उस स्थिति में आपको हरे टिक मार्क पर निशान लगाना चाहिए, जिसे उत्तर के रूप में चिह्नित किया गया हो। एसओ में आपका स्वागत है!
tonytonov

54
यदि आप उपयोग कर रहे हैं roxygen2, तो आप #' importFrom magrittr "%>%"NAMESPACE के दौरान स्वचालित रूप से पॉप्युलेट होने के लिए जोड़ सकते हैं roxygenize()
रोमन लुसट्रिक

38
@ RomanLuštrik, बस गायब @, होना चाहिए#' @importFrom magrittr "%>%"
Roah

13
ध्यान दें कि यह केवल आपको %>%अपने पैकेज में आंतरिक रूप से उपयोग करने की अनुमति देगा । यदि आपके एपीआई का उपयोग करने वाले चेन कार्यों के लिए उपयोगकर्ताओं की आवश्यकता होती है %>%, तो उन्हें अभी भी स्पष्ट रूप से लोड करना होगा magrittr। इस समस्या को हल करने का एक तरीका फ़ंक्शन को फिर से निर्यात करना है। यहाँ है एक उदाहरण यह कैसे करना है की।
रामनाथ

यह भी usethis पैकेज क्या करता है, जैसा कि यहां
जिगगंजर

33

अब आपके पैकेज में पाइप का समर्थन करने का एक आसान तरीका है। अद्भुत पैकेज usethisमें फ़ंक्शन है use_pipe()। आप उस फ़ंक्शन को एक बार चलाते हैं और यह सब कुछ संभालता है। इस प्रकार प्रलेखन use_pipe()में कार्य का वर्णन किया गया usethisहै:

क्या आपके पैकेज में आंतरिक रूप से मैग्रिट्र के पाइप का उपयोग करना आवश्यक है और अपने पैकेज के उपयोगकर्ताओं के लिए इसे फिर से निर्यात करना है:

DESCRIPTION में "आयात" के लिए magrittr जोड़ता है

आवश्यक roxygen टेम्पलेट के साथ आर / बर्तन-पाइप आर बनाता है


क्या आप use_pipe()उस कोड को लाइन में जोड़ते हैं जो आप पैकेज बनाने के लिए उपयोग करते हैं? उदाहरण के लिए, मैं चलाता हूं usethis::use_description(usethis_description); usethis::use_build_ignore(directories); usethis::use_build_ignore(paste0(pkg_name, ".Rproj")); if (file.exists(file.path(pkg_path, "NAMESPACE"))) { file.remove(file.path(pkg_path, "NAMESPACE")) }; devtools::document(pkg_path); devtools::check(pkg_path); devtools::load_all(pkg_path); devtools::install(pkg_path):। क्या मैं use_pipe()शुरुआत में जोड़ दूंगा?
जोश

1
@ usethisजब आप पैकेज विकसित कर रहे हों तो एक बार फ़ंक्शन का उपयोग करें । उन कार्यों के बाद निर्माण के निर्देश और बाकी सब कुछ आवश्यक भागों को जोड़ते हैं।
एंड्रयू ब्रोजा

32

एक अतिरिक्त समाधान - roxygenपैकेज का उपयोग करें । इसे devtoolsपैकेज के हिस्से के रूप में लागू किया गया है। devtoolsइंस्टॉल हो जाने के बाद , कॉलिंग devtools::document()आपके NAMESPACEलिए अपडेट हो जाएगी । यह ऑटो-बिल्ड भी करता है। प्रलेखन के साथ .Rd फाइलें, जो आसान है।

आप जो कुछ भी करते हैं #' @import packagename, उस पैकेज से सभी फ़ंक्शन #' @importFrom packagename functionnameआयात करने के लिए , या किसी फ़ंक्शन को आयात करने के लिए फ़ाइल में प्रारूप में एक विशेष टिप्पणी जोड़ें । आप अपनी फ़ाइलों में जितनी चाहें उतने टिप्पणियां कर सकते हैं, इसलिए आप उनमें से प्रत्येक फ़ाइल के शीर्ष पर, या आपके प्रत्येक कार्य के साथ एक बाहरी फ़ंक्शन की आवश्यकता हो सकती है।

फिर आप चलाते हैं devtools::document()और यह उन टिप्पणियों की तलाश में आपके कोड को पार्स करता है, और फिर यह NAMESPACEआपके लिए एक उपयुक्त फ़ाइल बनाता है । आसान।


1
जब मैं ऐसा करता हूं, तो यह निम्नलिखित ऑक्सीजन टिप्पणियों को गड़बड़ करता है जो आर स्क्रिप्ट में पहले फ़ंक्शन के लिए मदद फ़ाइल से संबंधित हैं। मैं मदद फ़ाइल वालों से वैश्विक ऑक्सीजन टिप्पणियों को कैसे अलग करूं?
jzadra

2
मैं आमतौर पर प्रत्येक फ़ंक्शन के साथ व्यक्तिगत रूप से आयात टिप्पणियां डालता हूं। इस तरह से यदि फ़ाइल में अन्य कार्य बदलते हैं, तो आपका आयात सटीक रहता है। तो फिर कोई वैश्विक परिभाषा नहीं हैं।
माइक स्टेनली

18

यह मानते हुए कि आप RStudio, Hadley के devtoolsपैकेज का उपयोग कर रहे हैं , और फ़ाइल magrittrके आयात अनुभाग में सूचीबद्ध DESCRIPTIONहैं, यहाँ वे चरण हैं जो मैंने %>%अपने पैकेज फ़ंक्शन (ओं) में काम करने के लिए उठाए हैं ।

सबसे पहले, फ़ंक्शन लिखें foo.R:

#' Convert \code{data.frame} to \code{list}.
#' 
#' @importFrom magrittr %>%
#' @name %>%
#' @rdname pipe
#' @export
#' @param x A \code{data.frame} object.
#' @examples
#' my_result <- foo(iris)
#'
foo <- function(x) {
    x %>%
        as.list()
}

दूसरा, भागो devtools::document()

तीसरा, भागो devtools::load_all()

इस तरह की फाइल आपकी R/डायरेक्टरी में बनाई जाएगी और आपका फंक्शन उम्मीद के मुताबिक काम करना चाहिए।


6
यहाँ क्या उद्देश्य @name %>%है?
जेलेनाउक्लिना
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.