2013-08-20 5 views
20

का उपयोग कर मैं एक क्रैन पैकेज के मेंटेनर हूँ और निम्न संदेश मिलता ही नाम के दो कार्यों का आयात जब लोड हो रहा है:roxygen2

* checking whether package ‘qdap’ can be installed ... [10s/10s] WARNING 
Found the following significant warnings: 
    Warning: replacing previous import ‘annotate’ when loading ‘NLP’ 
    Warning: replacing previous import ‘rescale’ when loading ‘scales’ 

क्योंकि मैं plotrix का उपयोग करें और संकुल मापता NLP और ggplot के साथ ही संकुल। उनके पास rescale और annotate कार्य सामान्य हैं। इसके परिणामस्वरूप नवीनतम सीआरएएन जांच के साथ एक महत्वपूर्ण चेतावनी है। तो मैं इसे "ठीक करने" का फैसला करता हूं।

मैं इस तरह वर्णन कुछ बनाया:

Package: qdap 
Type: Package 
Title: Bridging the gap between qualitative data and quantitative analysis 
Version: 1.0.0 
Date: 2013-06-26 
Author: Tyler Rinker 
Maintainer: Tyler Rinker <[email protected]> 
Depends: 
    R (>= 3.0.0), 
    ggplot2 (>= 0.9.3.1), 
    gdata, 
    grid, 
Imports: 
    NLP, 
    openNLP, 
    plotrix, 
    scales, 
LazyData: TRUE 
Description: Stuff 
License: GPL-2 

और कुछ .R फ़ाइलों को यह कहा:

#' @import ggplot2 gridExtra RColorBrewer 
#' @importFrom scales alpha 

लेकिन यह एक और चेतावनी में परिणाम:

* installing *source* package 'qdap' ... 
** R 
** data 
*** moving datasets to lazyload DB 
** inst 
** preparing package for lazy loading 
Warning: replacing previous import 'rescale' when loading 'scales' 
Warning: replacing previous import 'annotate' when loading 'NLP' 
Warning: replacing previous import 'alpha' when loading 'scales' 

कैसे क्या मैं roxygen2 का importFrom टैग सही तरीके से उपयोग करता हूं?

मैंने पढ़ लिया है: https://github.com/hadley/devtools/wiki/Namespaces

लेकिन मैं एक उदाहरण है जहां किसी को यह करना ही था से सबसे अच्छा सीखते हैं।

* checking whether package ‘qdap’ can be installed ... [10s/10s] WARNING 
Found the following significant warnings: 
    Warning: replacing previous import ‘annotate’ when loading ‘NLP’ 
    Warning: replacing previous import ‘rescale’ when loading ‘scales’ 

यहाँ qdap GitHub Repo

+0

ध्यान दें कि आप अभी भी दोनों पैकेज आयात कर रहे हैं। पैकेज आयात करने के लिए कोई फ़ंक्शन विशिष्ट तरीका नहीं है। बस अपनी NAMESPACE फ़ाइल देखें - आपके पास अभी भी सभी संकुलों के लिए आयात है। – Dason

+0

कभी भी पूरे पैकेज के NAMESPACE को आयात न करें। आपको आवश्यक सभी प्रतीकों को आयात करें और नहीं। '@ आयात' बुरा है। ये "पिछले आयात चेतावनियों को प्रतिस्थापित करते हैं" गुणा करते हैं जैसे आप NAMESPACES आयात करना प्रारंभ करते हैं जो अन्य NAMESPACES आयात करते हैं। – GSee

+0

@GSee इसका मतलब यह है कि मुझे सभी '@ import' को पार करना होगा और '@ importFrom'' से प्रतिस्थापित करना होगा? अगर केवल लोगों ने अपने कार्यों को elvish और अन्य अस्पष्ट भाषाओं में नामित किया। –

उत्तर

18

ध्यान में रखने की बात यह है कि आप अधिक नहीं हो सकता है: मैं कैसे वर्णन फ़ाइल सही तरीके से करने के साथ ही roxygen2 टैग के उपयोग को स्वरूपित करने से बचने के लिए की अनिश्चित हूँ के साथ एक फ़ंक्शन से आपके पैकेज के नामस्थान में वही नाम।

मान लीजिए कि दो पैकेज, पीकेजीए और पीकेजीबी हैं, दोनों एक फंक्शन को foo कहते हैं। यदि आप एक पैकेज बनाते हैं, तो पीकेजीसी, जिसमें import(pkgA) और import(pkgB) NAMESPACE में है। अब, जब आप फोन library(pkgC) आप एक चेतावनी मिल जाएगा:

replacing previous import 'foo' when loading 'pkgB'. 

अब, मान लीजिए किसी अन्य पैकेज, pkgD, NAMESPACE फ़ाइल में इस है कि बनाता है:

import(pkgA) 
import(pkgB) 
import(pkgC) 

फिर, library(pkgD) हर किसी को 30 सालपूरे नामस्थान आयात करने, फिर की प्रथा को गोद ले तो

1: replacing previous import ‘foo’ when loading ‘pkgB’ 
2: replacing previous import ‘foo’ when loading ‘pkgB’ 

: 2 चेतावनी देगा अब से, इनमें से बहुत सी चेतावनियां होंगी।

इसके बजाय, के बाद से आप केवल एक ही "foo" अपने पैकेज में हो सकता है, आप स्पष्ट रूप से "foo" (और अन्य कार्यों) जिसे आप उपयोग करना अपने पैकेज चाहते आयात करना चाहिए।उपरोक्त उदाहरण में, pkgD के लिए NAMESPACE होना चाहिए

importFrom(pkgB,foo) 

आप वास्तव में दो अलग-अलग पैकेज से ही नाम के दो कार्यों का उपयोग करने के लिए की जरूरत है, एक हैक आप प्रदर्शन कर सकते हैं प्रत्येक पैकेज से करने के लिए अन्य कार्यों आयात करने के लिए है सुनिश्चित संकुल स्थापित कर रहे हैं और उनके नामस्थान लोड किए गए हैं, लेकिन फिर अपने NAMESPACE में इस रखकर कार्यों आप :: अंकन का उपयोग करने की जरूरत का संदर्भ लें:

importFrom(pkgA,foo) 
importFrom(pkgB,bar) 

और फिर बुला कार्यों pkgA::abc() और अपने कोड में pkgB::abc()

+0

यदि आपने दो पैकेज आयात किए हैं जिनमें प्रत्येक के पास आपके पैकेज में 'foo' फ़ंक्शन था, तो क्या आप दोनों के बीच अंतर करने के लिए '::' वाक्यविन्यास का उपयोग नहीं कर सकते? उदाहरण के लिए 'pkgA :: foo() 'और' pkgB :: foo() '? ('ImportFrom' का उपयोग करके ऐसा करने की संभावनाओं को नाटकीय रूप से कम करना चाहिए) – geneorama

+1

@ जीनोरामा आप 'pkgA' से' foo' तक पहुंचने के लिए 'pkgA :: foo() 'का उपयोग कर सकते हैं, लेकिन यह इसे आपके पैकेज के नामस्थान में आयात नहीं करेगा । आपके पैकेज के नामस्थान में एक ही नाम के साथ एक से अधिक फ़ंक्शन नहीं हो सकते हैं। – GSee

+1

मैं अपने पैकेज में 'gwidgets :: gtable' और' gtable :: gtable' दोनों का उपयोग करता हूं, जो मुझे चेतावनी देता है। इसे हल करने के तरीके पर कोई सुझाव? –

3

अधिकतर आपके लिए अब उपयोग नहीं किया जा सकता है लेकिन शायद दूसरों के लिए: आपके प्रश्न का उत्तर उस वेबसाइट में पाया जा सकता है, विशेष रूप से, यहां (स्रोत से उद्धरण): "इससे कोई फर्क नहीं पड़ता कि आप कितनी बार उपयोग करते हैं @importFrom foo bar "।

तो roxygen2 के टैग @importFrom का सही उपयोग है: @importFrom package_name function_name। कोई अल्पविराम, संश्लेषण, कुछ भी नहीं, केवल दो नाम एक स्थान से अलग होते हैं (संभावित रूप से 1 से अधिक फ़ंक्शन पर लागू होते हैं)।

मैंने अपने पैकेज में से किसी एक के नए संस्करण के लिए प्रलेखन उत्पन्न करते समय अभी यह कोशिश की है, इसलिए इसे काम करना चाहिए।

मुझे उम्मीद है कि यह मदद करता है।

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