"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 game mgcv. Se dois outros pacotes fossem carregados, um deles dependendo game 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 importou importFromdiretivas no NAMESPACEarquivo), as questões seriam melhoradas de duas maneiras. (1) O pacote ganharia controle sobre qual mgcvfunçã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 mgcvfunçã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 Aque se "Depends"em outro pacote B, o pacote provavelmente precisará anexar Acom uma "Dependsdirectiva.
Isso ocorre porque as funções no pacote Aforam escritas com a expectativa de que o pacote Be suas funções sejam anexadas ao search()caminho .
Uma "Depends"diretiva carregará e anexará o pacote A; nesse momento, Aa "Depends"diretiva do próprio pacote , em uma reação em cadeia, fará com que o pacote Bseja carregado e anexado também. As funções no pacote Apoderão encontrar as funções no pacote Bnas 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 Aesteja usando "Imports"para apontar para quaisquer funções nas Bquais precise acessar.) Chamadas pelas suas funções para quaisquer funções no pacote Aque dependam de funções no pacote B. consequentemente falhar.
As duas únicas soluções são:
- Faça seu pacote anexar pacote
Ausando uma "Depends"diretiva.
- Melhor a longo prazo, entre em contato com o mantenedor do pacote
Ae 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 ).