"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à né carico né 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:
- avere il vostro pacchetto di allegare pacchetto
A
utilizzando una direttiva "Depends"
.
- 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).
Il tuo post mi ha detto tutto sulla struttura del pacchetto, quando ho iniziato a programmare [* * moduli] (https://github.com/klmr/moduli). Grazie! –