2011-12-26 10 views
122

Il manuale "Writing R Extensions" fornisce le seguenti indicazioni su quando utilizzare Importazioni o Dipende:spiegare meglio quando usare Imports/Dipende

The general rules are

  • Packages whose namespace only is needed to load the package using library(pkgname) must be listed in the ‘Imports’ field and not in the ‘Depends’ field.
  • Packages that need to be attached to successfully load the package using library(pkgname) must be listed in the ‘Depends’ field, only.

Qualcuno può fornire un po 'più di chiarezza su questo? Come faccio a sapere quando il mio pacchetto ha bisogno solo di spazi dei nomi caricati rispetto a quando ho bisogno di un pacchetto da allegare? Quali sono gli esempi di entrambi? Penso che il pacchetto tipico sia solo una raccolta di funzioni che a volte chiamano funzioni in altri pacchetti (dove alcuni lavori sono già stati codificati). È questo scenario 1 o 2 sopra?

Modifica

ho scritto un blog post con una sezione su questo argomento specifico (ricerca per 'Le importazioni v Dipende'). Le immagini lo rendono molto più facile da capire.

+0

Il tuo post mi ha detto tutto sulla struttura del pacchetto, quando ho iniziato a programmare [* * moduli] (https://github.com/klmr/moduli). Grazie! –

risposta

117

"Imports" è più sicuro di "Depends" (e rende anche un pacchetto che utilizza un "cittadino migliore" rispetto ad altri pacchetti che utilizzano "Depends").

Una direttiva "Depends" tenta di assicurare che una funzione di un altro pacchetto è disponibile collegando l'altro pacchetto al percorso di ricerca principale (cioè l'elenco degli ambienti restituito da search()). Questa strategia può, tuttavia, essere vanificata se un altro pacchetto, caricato in seguito, colloca una funzione con nome identico prima sul percorso di ricerca. Le camere() utilizzano l'esempio della funzione "gam", che si trova in entrambi i pacchetti gam e mgcv. Se sono stati caricati altri due pacchetti, uno dei quali dipende da gam e uno a seconda di mgcv, la funzione trovata dalle chiamate a gam() dipenderà dall'ordine in cui sono stati collegati questi due pacchetti. Non bene.

Una direttiva "Imports" inserisce il pacchetto importato in <imports:packageName> (cercato immediatamente dopo <namespace:packageName>), anziché nel percorso di ricerca regolare. Se uno dei due pacchetti nell'esempio precedente utilizzava il meccanismo "Imports", le questioni sarebbero migliorate in due modi. (1) Il pacchetto acquisirà automaticamente il controllo su quale funzione viene utilizzata la funzione mgcv. (2) Mantenendo il percorso di ricerca principale libero dagli oggetti importati, non comprometterebbe nemmeno potenzialmente la dipendenza dell'altro pacchetto dall'altra funzione mgcv.

Ecco perché utilizzare gli spazi dei nomi è una buona pratica, perché è ora applicato da CRAN e (in particolare) perché l'utilizzo di "Imports" è più sicuro rispetto all'utilizzo di "Depends".


A cura di aggiungere un importante avvertimento:

C'è uno eccezione purtroppo comune a consigli di cui sopra: se il pacchetto si basa su un pacchetto A che si "Depends" su un altro pacchetto B, la vostra il pacchetto dovrà probabilmente allegare A con una direttiva "Depends.

Questo perché funzioni in pacchetto A stati scritti con l'aspettativa che pacchetto B e le sue funzioni saranno fissati al search() percorso.

Una direttiva "Depends" caricherà e allegare pacchetto A, a quel punto il pacchetto A s' proprio direttiva "Depends" sarà, in una reazione a catena, causa pacchetto B da caricare e attaccato pure. Le funzioni nel pacchetto A saranno quindi in grado di trovare le funzioni nel pacchetto B su cui si basano.

Una direttiva "Imports" verrà caricato ma non allegare pacchetto A e sarà carico allegare pacchetto B. ("Imports", si aspetta che gli scrittori di pacchetti utilizzino il meccanismo dello spazio dei nomi e che il pacchetto A utilizzi "Imports" per fare riferimento a qualsiasi funzione in B a cui è necessario accedere.) Chiama le tue funzioni a qualsiasi funzione nel pacchetto A che si basano sulle funzioni nel pacchetto B verrà quindi esito negativo.

Le uniche due soluzioni sono a uno:

  1. avere il vostro pacchetto di allegare pacchetto A utilizzando una direttiva "Depends".
  2. Meglio nel lungo periodo, contattare il manutentore del pacchetto A e chiedere loro di fare un lavoro più attento nella costruzione del loro spazio dei nomi (nelle parole di Martin Morgan in this related answer).
+0

ah! grazie Josh, oggi fai un giro. – SFun28

+0

Beh, sono state entrambe domande interessanti e, come ho recentemente iniziato a confezionare alcuni dei miei progetti, ho viaggiato lungo le stesse vie di pensiero che hai;) –

+1

Recentemente ho fatto una domanda simile e recentemente lottato potentemente con questi problemi, questi sono concetti sottili e spesso mal comunicati. Ti rimanderò qui per un'altra spiegazione: http: // StackOverflow.it/questions/7880355/prossimi-namespace-depends-imports-changes-for-2-14-0-some-definitions-use-pl –

13

Le camere di SfDA dicono di utilizzare "Importa" quando questo pacchetto utilizza un meccanismo di "spazio dei nomi" e poiché tutti i pacchetti ora sono obbligati ad averli, allora la risposta potrebbe essere sempre utilizzata "Importa". In passato i pacchetti potevano essere caricati senza avere effettivamente spazi dei nomi e in tal caso avresti dovuto usare Depends.

+2

quando un pacchetto è specificato in "importazioni" e voglio usare una funzione nel pacchetto, le mie funzioni devono chiamare la libreria (...) o tutte le funzioni sono già disponibili nel percorso di ricerca? Inoltre, cos'è lo Sfda? link? – SFun28

+2

* Software per analisi dati *: http://www.springer.com/statistics/computanional+statistics/book/978-0-387-75935-7 ... per quanto riguarda le vostre domande, non conosco la risposta a mano a mano, ma potresti facilmente ottenere un pacchetto di test minimale e trovare la risposta empiricamente ... –

+1

SfDA == "Software per l'analisi dei dati". [65] a http://www.r-project.org/doc/bib/R-books.html. Se un pacchetto specifica un altro pacchetto, dovresti vedere un messaggio che ti informa sul caricamento di dipend (encies) e import (ations) quando usi la libreria() o require() sulla console. Sì, dovrebbero essere disponibili. –

23

Hadley Wickham dà una spiegazione facile (http://r-pkgs.had.co.nz/namespace.html):

Listing a package in either Depends or Imports ensures that it’s installed when needed. The main difference is that where Imports just loads the package, Depends attaches it. There are no other differences. [...]

Unless there is a good reason otherwise, you should always list packages in Imports not Depends . That’s because a good package is self-contained, and minimises changes to the global environment (including the search path). The only exception is if your package is designed to be used in conjunction with another package. For example, the analogue package builds on top of vegan. It’s not useful without vegan, so it has vegan in Depends instead of Imports . Similarly, ggplot2 should really Depend on scales, rather than Importing it.

Problemi correlati