"Imports"
è più sicuro di "Depends"
(e rende anche un pacchetto usandolo un "cittadino migliore" rispetto ad altri pacchetti che usano "Depends"
).
Una "Depends"
direttiva tenta di garantire la disponibilità di una funzione di un altro pacchetto collegando l'altro pacchetto al percorso di ricerca principale (ovvero l'elenco degli ambienti restituiti da search()
). Questa strategia può tuttavia essere contrastata se un altro pacchetto, caricato in un secondo momento, inserisce una funzione con nome identico in precedenza sul percorso di ricerca. Chambers ( in SoDA ) usa l'esempio della funzione "gam"
, che si trova in entrambi i pacchetti gam
e mgcv
. Se fossero stati caricati altri due pacchetti, uno a seconda gam
e uno a seconda mgcv
, la funzione trovata dalle chiamate gam()
dipenderebbe dall'ordine in cui erano collegati quei due pacchetti. Non bene.
Una "Imports"
direttiva dovrebbe essere utilizzata per qualsiasi pacchetto di supporto le cui funzioni devono essere inserite <imports:packageName>
(ricercate immediatamente dopo <namespace:packageName>
), anziché sul normale percorso di ricerca. Se uno dei pacchetti nell'esempio sopra usasse il "Imports"
meccanismo (che richiede anche import
o importFrom
direttive nel NAMESPACE
file), le cose sarebbero migliorate in due modi. (1) Il pacchetto otterrebbe esso stesso il controllo su quale mgcv
funzione viene utilizzata. (2) Mantenendo il percorso di ricerca principale libero dagli oggetti importati, non si spezzerebbe nemmeno potenzialmente la dipendenza dell'altro pacchetto dall'altra mgcv
funzione.
Questo è il motivo per cui l'utilizzo degli spazi dei nomi è una buona pratica, perché ora è applicato da CRAN e (in particolare) perché l'uso "Imports"
è più sicuro dell'uso "Depends"
.
Modificato per aggiungere un avvertimento importante:
V'è un'eccezione, purtroppo, comune alla consigli di cui sopra: se il pacchetto si basa su un pacchetto che si da un altro pacchetto , il pacchetto sarà probabilmente necessario collegare con una direttiva.A
"Depends"
B
A
"Depends
Questo perché le funzioni nel pacchetto A
sono state scritte con l'aspettativa che il pacchetto B
e le sue funzioni siano associate al search()
percorso .
Una "Depends"
direttiva caricherà e allegherà il pacchetto A
, a quel punto A
la "Depends"
direttiva del pacchetto stesso , in una reazione a catena, causerà B
anche il caricamento e il collegamento del pacchetto . Le funzioni nel pacchetto A
saranno quindi in grado di trovare le funzioni nel pacchetto B
su cui si basano.
Una "Imports"
direttiva caricherà ma non allegherà il pacchetto A
e non caricherà né alleggerà il pacchetto B
. ( "Imports"
, Dopo tutto, si aspetta che gli scrittori del pacchetto utilizzano il meccanismo di namespace, e quel pacchetto A
saranno utilizzare "Imports"
per puntare a qualsiasi funzioni B
che hanno bisogno di accedere a.) Chiama per le funzioni di tutte le funzioni in pacchetto A
che si basano sulle funzioni nella confezione B
volontà di conseguenza fallire.
Le uniche due soluzioni sono:
- Chiedi al tuo pacchetto di allegare il pacchetto
A
usando una "Depends"
direttiva.
- Meglio a lungo termine, contattare il manutentore del pacchetto
A
e chiedere loro di fare un lavoro più attento nel costruire il proprio spazio dei nomi (nelle parole di Martin Morgan in questa risposta correlata ).