2013-08-20 6 views
20

Sono un manutentore di un pacchetto CRAN e ottenere i seguenti messaggi durante il caricamento:Importazione di due funzioni con lo stesso nome utilizzando 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’ 

Perché io uso il plotrix e scale pacchetti così come il PNL e ggplot Pacchetti. Hanno le funzioni rescale e annotate in comune. Ciò si traduce in un avvertimento significativo con l'ultimo controllo CRAN. Quindi decido di "aggiustarlo".

ho fatto la descrizione qualcosa di simile:

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 

e ha aggiunto questo per alcuni file .R:

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

Ma questo si traduce in un altro avvertimento:

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

Come faccio a utilizzare il tag importFrom correttamente?

Ho letto: https://github.com/hadley/devtools/wiki/Namespaces

Ma io imparare meglio da un esempio in cui qualcuno doveva pur farlo. Io sono sicuro di come formattare il file di descrizione in modo corretto, così come l'uso di roxygen2 tag da evitare:

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

Ecco la qdap GitHub Repo

+0

Nota che stai ancora importando entrambi i pacchetti. Non esiste un modo specifico per l'importazione dei pacchetti. Guarda il tuo file NAMESPACE: hai ancora delle importazioni per tutti i pacchetti. – Dason

+0

Non importa mai l'intero NAMESPACE di un pacchetto. Importa tutti i simboli necessari e non di più. '@ import' è il male. Questi "rimpiazzando i precedenti avvisi di importazione" si moltiplicano quando inizi a importare NAMESPACES che importano altri NAMESPACES. – GSee

+0

@GSee significa che devo passare e rimuovere tutti '@ import' e sostituire con:' @ importFrom'? Se solo le persone chiamassero le loro funzioni nelle lingue elfiche e in altre lingue oscure. –

risposta

18

La cosa da tenere a mente è che non si può avere di più di una funzione con lo stesso nome nello spazio dei nomi del pacchetto.

Supponiamo che ci siano due pacchetti, pkgA e pkgB, che entrambi esportano una funzione chiamata foo. Se crei un pacchetto, pkgC, che ha import(pkgA) e import(pkgB) nel NAMESPACE. Ora, quando si chiama library(pkgC) si otterrà un avvertimento:

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

Ora, supponiamo che qualcuno crea un altro pacchetto, pkgD, che ha questa nel file namespace:

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

Poi, library(pkgD) darà 2 avvertimenti:

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

Se ognuno adotta la pratica di importare interi spazi dei nomi, di 30 anni da ora, ci saranno molti di questi avvertimenti.

Invece, dal momento che è possibile avere un solo "pippo" nel pacchetto, è necessario importare in modo esplicito il "pippo" (e altre funzioni) che si desidera utilizzare per il pacchetto .Nell'esempio di cui sopra, lo spazio dei nomi per pkgD dovrebbe essere

importFrom(pkgB,foo) 

Se hai veramente bisogno di utilizzare le due funzioni con lo stesso nome da due diversi pacchetti, Una trucco è possibile eseguire è quello di importare altre funzioni da ogni pacchetto di garantire che i pacchetti sono installati e le loro spazi dei nomi vengono caricati, ma poi fare riferimento alle funzioni che servono utilizzando la notazione :: mettendo questo nel vostro namespace:

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

e quindi chiamando le funzioni pkgA::abc() e pkgB::abc() nel codice.

+0

Se avete importato due pacchetti che avevano ciascuno una funzione 'pippo' nel vostro pacchetto, non potreste usare la sintassi' :: 'per distinguere tra i due? Ad esempio 'pkgA :: foo()' e 'pkgB :: foo()'? (Usare 'importFrom' dovrebbe ridurre drasticamente le possibilità di doverlo fare) – geneorama

+1

@geneorama Puoi usare' pkgA :: foo() 'per accedere a' foo' da 'pkgA', ma NON lo importa nello spazio dei nomi del tuo pacchetto . Lo spazio dei nomi del tuo pacchetto non può avere più di una funzione con lo stesso nome. – GSee

+1

Io uso entrambi 'gWidgets :: gtable' e' gtable :: gtable' nel mio pacchetto, che mi danno un AVVERTIMENTO. Qualche suggerimento su come risolvere questo? –

3

Molto probabilmente non più utile per voi ma forse per gli altri: la risposta alla tua domanda può essere trovata nel sito web che citi, in particolare, qui (citando dalla fonte): "Non importa quante volte usi @importFrom foo bar ".

Quindi l'uso corretto del tag di roxygen2 @importFrom è: @importFrom nome_pacchetto nome_funzione. Nessuna virgola, parentesi, niente, solo i due nomi separati da uno spazio (eventualmente applicabile a più di 1 funzione, in modo ovvio).

Ho provato questo solo ora quando si genera la documentazione per la nuova versione di uno dei miei pacchetti, quindi dovrebbe funzionare.

Spero che aiuti.