2013-08-20 12 views
20

ich ein Betreuer eines CRAN-Paket bin und die folgenden Meldungen erhalten, wenn Lade:Importieren von zwei Funktionen mit demselben Namen 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’ 

Da verwende ich die plotrix und Pakete sowie die NLP und ggplot skaliert Pakete. Sie haben die Funktionen rescale und annotate gemeinsam. Dies führt zu einer signifikanten Warnung mit dem neuesten CRAN-Check. Also beschließe ich, es zu "reparieren".

ich die Beschreibung in etwa so aus:

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 

Und fügte hinzu, dies zu einigen .R Dateien:

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

Aber dies führt zu einer weiteren Warnung:

* 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' 

Wie verwende ich roxygen2importFrom Tag richtig?

Ich habe gelesen: https://github.com/hadley/devtools/wiki/Namespaces

Aber ich lerne am besten von einem Beispiel, wo jemand dies zu tun hatte. Ich bin nicht sicher, wie die Beschreibungsdatei zu formatieren korrekt sowie die Verwendung von roxygen2 Tags zu vermeiden:

* 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’ 

Hier ist der Hintergrund ist qdap GitHub Repo

+0

Beachten Sie, dass Sie immer noch beide Pakete importieren. Es gibt keine funktionsspezifische Möglichkeit, Pakete zu importieren. Schauen Sie sich nur Ihre NAMESPACE-Datei an - Sie haben immer noch Importe für alle Pakete. – Dason

+0

Niemals den gesamten NAMESPACE eines ganzen Pakets importieren. Importieren Sie alle Symbole, die Sie brauchen, und nicht mehr. '@ import' ist böse. Diese "vorherigen Importwarnungen ersetzen" multiplizieren sich, wenn Sie NAMESPACES importieren, die andere NAMESPACES importieren. – GSee

+0

@GSee bedeutet dies, ich muss gehen und alle '@ import' entfernen und ersetzen mit:' @ importFrom'? Wenn nur Menschen ihre Funktionen in elfenhaften und anderen obskuren Sprachen nannten. –

Antwort

18

Das, was zu halten ist, dass Sie nicht mehr haben können als eine Funktion mit den gleichen Namen im Namespace Ihres Pakets.

Angenommen, es gibt zwei Pakete, pkgA und pkgB, die beide eine Funktion namens foo exportieren. Wenn Sie ein Paket erstellen, pkgC, das import(pkgA) und import(pkgB) im NAMESPACE hat. Wenn Sie nun library(pkgC) rufen werden Sie eine Warnung erhalten:

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

Nun nehmen wir jemand schafft ein anderes Paket, pkgD, dass dies in der Namespace-Datei hat:

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

Dann library(pkgD) 2 Warnungen geben:

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

Wenn jeder der Praxis des Imports ganze Namensräume nimmt, dann 30 Jahre von jetzt an wird es eine Menge dieser Warnungen geben.

Da Sie nur ein einzelnes "foo" in Ihrem Paket haben können, sollten Sie explizit "foo" (und andere Funktionen) importieren, die Sie für Ihr Paket verwenden möchten.In dem obigen Beispiel sollte der Namensraum für pkgD

sein
importFrom(pkgB,foo) 

Wenn Sie tatsächlich die beiden Funktionen mit dem gleichen Namen von zwei verschiedenen Paketen benutzen müssen, kann man hacken Sie durchführen, andere Funktionen von jedem Paket importieren sicherzustellen, dass die Pakete installiert und ihre Namensraum geladen werden, aber dann auf die Funktionen beziehen Sie :: Notation verwenden müssen, indem diese in Ihrem Namensraum:

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

und dann Funktionen pkgA::abc() und pkgB::abc() in Ihrem Code aufrufen.

+0

Wenn Sie zwei Pakete importiert haben, die jeweils eine Funktion 'foo' in Ihrem Paket haben, können Sie nicht die' '' - Syntax verwenden, um zwischen den beiden zu unterscheiden? Zum Beispiel 'pkgA :: foo()' und 'pkgB :: foo()'? (Die Verwendung von 'importFrom' sollte die Wahrscheinlichkeit, dies zu tun, drastisch reduzieren) – geneorama

+1

@geneorama Sie können' pkgA :: foo() 'verwenden, um' foo' von 'pkgA' zu erreichen, aber es wird NICHT in den Namespace Ihres Pakets importiert . Der Namespace Ihres Pakets darf nicht mehr als eine Funktion mit demselben Namen haben. – GSee

+1

Ich benutze sowohl 'gWidgets :: gtable' als auch' gtable :: gtable' in meinem Paket, die mir eine WARNUNG geben. Irgendwelche Vorschläge, wie man das löst? –

3

Höchstwahrscheinlich nicht mehr von Nutzen, aber vielleicht für andere: Die Antwort auf Ihre Frage finden Sie auf der von Ihnen genannten Website, hier insbesondere (Zitat aus der Quelle): "Egal wie oft Sie verwenden @importFrom foo bar ".

Also die richtige Verwendung von roxygen2's Tag @ ImportFrom ist: @ ImportFrom Paketname Funktionsname. Keine Kommas, Klammern, nichts, nur die zwei Namen getrennt durch ein Leerzeichen (möglicherweise auf mehr als 1 Funktion in der offensichtlichen Weise anwendbar).

Ich habe das selbst gerade beim Generieren der Dokumentation für die neue Version eines meiner Pakete ausprobiert, damit es funktionieren sollte.

Ich hoffe es hilft.

Verwandte Themen