"Imports"
é mais seguro do que "Depends"
(e também torna um pacote usá-lo um 'cidadão melhor' em relação a outros pacotes que o utilizam "Depends"
).
Uma "Depends"
diretiva tenta garantir que uma função de outro pacote esteja disponível anexando o outro pacote ao caminho de pesquisa principal (ou seja, a lista de ambientes retornados por search()
). Essa estratégia pode, no entanto, ser frustrada se outro pacote, carregado posteriormente, colocar uma função com nome idêntico anteriormente no caminho da pesquisa. Chambers ( no SoDA ) usa o exemplo da função "gam"
, encontrada nos pacotes gam
e mgcv
. Se dois outros pacotes fossem carregados, um deles dependendo gam
e um dependendo mgcv
, a função encontrada pelas chamadas gam()
dependeria da ordem em que esses dois pacotes foram anexados. Não é bom.
Uma "Imports"
diretiva deve ser usada para qualquer pacote de suporte cujas funções sejam colocadas <imports:packageName>
(pesquisadas imediatamente após <namespace:packageName>
), em vez de no caminho de pesquisa regular. Se um dos pacotes no exemplo acima usasse o "Imports"
mecanismo (que também requer import
ou importFrom
diretivas no NAMESPACE
arquivo), as questões seriam melhoradas de duas maneiras. (1) O pacote ganharia controle sobre qual mgcv
função é usada. (2) Ao manter o caminho de pesquisa principal livre dos objetos importados, ele nem sequer quebraria a dependência do outro pacote em relação à outra mgcv
função.
É por isso que usar namespaces é uma prática tão boa, agora é aplicada pelo CRAN e (em particular) por que usar "Imports"
é mais seguro do que usar "Depends"
.
Editado para adicionar uma ressalva importante:
Há uma exceção, infelizmente, comuns ao conselho acima: se o seu pacote depende de um pacote A
que se "Depends"
em outro pacote B
, o pacote provavelmente precisará anexar A
com uma "Depends
directiva.
Isso ocorre porque as funções no pacote A
foram escritas com a expectativa de que o pacote B
e suas funções sejam anexadas ao search()
caminho .
Uma "Depends"
diretiva carregará e anexará o pacote A
; nesse momento, A
a "Depends"
diretiva do próprio pacote , em uma reação em cadeia, fará com que o pacote B
seja carregado e anexado também. As funções no pacote A
poderão encontrar as funções no pacote B
nas quais elas dependem.
Uma "Imports"
diretiva carregará, mas não anexará o pacote A
, nem carregará nem anexará o pacote B
. ( "Imports"
afinal de contas, espera que os gravadores de pacotes estejam usando o mecanismo de namespace e esse pacote A
esteja usando "Imports"
para apontar para quaisquer funções nas B
quais precise acessar.) Chamadas pelas suas funções para quaisquer funções no pacote A
que dependam de funções no pacote B
. consequentemente falhar.
As duas únicas soluções são:
- Faça seu pacote anexar pacote
A
usando uma "Depends"
diretiva.
- Melhor a longo prazo, entre em contato com o mantenedor do pacote
A
e peça que ele faça um trabalho mais cuidadoso na construção de seu espaço para nome (nas palavras de Martin Morgan nesta resposta relacionada ).