"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 game mgcv. Se fossero stati caricati altri due pacchetti, uno a seconda game 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 importo importFromdirettive nel NAMESPACEfile), le cose sarebbero migliorate in due modi. (1) Il pacchetto otterrebbe esso stesso il controllo su quale mgcvfunzione 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 mgcvfunzione.
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"BA"Depends
Questo perché le funzioni nel pacchetto Asono state scritte con l'aspettativa che il pacchetto Be le sue funzioni siano associate al search()percorso .
Una "Depends"direttiva caricherà e allegherà il pacchetto A, a quel punto Ala "Depends"direttiva del pacchetto stesso , in una reazione a catena, causerà Banche il caricamento e il collegamento del pacchetto . Le funzioni nel pacchetto Asaranno quindi in grado di trovare le funzioni nel pacchetto Bsu cui si basano.
Una "Imports"direttiva caricherà ma non allegherà il pacchetto Ae 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 Asaranno utilizzare "Imports"per puntare a qualsiasi funzioni Bche hanno bisogno di accedere a.) Chiama per le funzioni di tutte le funzioni in pacchetto Ache si basano sulle funzioni nella confezione Bvolontà di conseguenza fallire.
Le uniche due soluzioni sono:
- Chiedi al tuo pacchetto di allegare il pacchetto
Ausando una "Depends"direttiva.
- Meglio a lungo termine, contattare il manutentore del pacchetto
Ae chiedere loro di fare un lavoro più attento nel costruire il proprio spazio dei nomi (nelle parole di Martin Morgan in questa risposta correlata ).