"Imports"
lebih aman daripada "Depends"
(dan juga membuat paket menggunakannya 'warga negara yang lebih baik' sehubungan dengan paket lain yang menggunakannya "Depends"
).
Sebuah "Depends"
upaya direktif untuk memastikan bahwa fungsi dari paket lain yang tersedia dengan melampirkan paket lain untuk path pencarian utama (yaitu daftar lingkungan dikembalikan oleh search()
). Strategi ini, bagaimanapun, dapat digagalkan jika paket lain, yang dimuat kemudian, menempatkan fungsi yang identik sebelumnya di jalur pencarian. Ruang ( dalam SoDA ) menggunakan contoh fungsi "gam"
, yang ditemukan di kedua paket gam
dan mgcv
. Jika dua paket lain dimuat, satu tergantung gam
dan satu tergantung mgcv
, fungsi yang ditemukan oleh panggilan gam()
akan tergantung pada urutan dua paket tersebut dilampirkan. Tidak baik.
Sebuah "Imports"
direktif harus digunakan untuk setiap paket pendukung yang fungsinya adalah untuk ditempatkan di <imports:packageName>
(dicari segera setelah <namespace:packageName>
), bukan di jalan pencarian biasa. Jika salah satu paket dalam contoh di atas menggunakan "Imports"
mekanisme (yang juga membutuhkan import
atau importFrom
arahan dalam NAMESPACE
file), masalah akan diperbaiki dengan dua cara. (1) Paket itu sendiri akan mendapatkan kendali atas mgcv
fungsi yang digunakan. (2) Dengan menjaga jalur pencarian utama bersih dari objek yang diimpor, itu bahkan tidak akan berpotensi memecah ketergantungan paket lain pada mgcv
fungsi lainnya .
Inilah sebabnya mengapa menggunakan namespace adalah praktik yang sangat baik, mengapa sekarang diberlakukan oleh CRAN, dan (khususnya) mengapa menggunakan "Imports"
lebih aman daripada menggunakan "Depends"
.
Diedit untuk menambahkan peringatan penting:
Ada satu pengecualian sayangnya umum untuk saran di atas: jika paket Anda bergantung pada paket A
yang sendiri "Depends"
pada paket lain B
, paket Anda mungkin akan perlu melampirkan A
dengan "Depends
direktif.
Ini karena fungsi-fungsi dalam paket A
ditulis dengan harapan bahwa paket B
dan fungsinya akan dilampirkan pada search()
path .
Sebuah "Depends"
direktif akan memuat dan melampirkan paket A
, di mana titik paket A
's sendiri "Depends"
direktif akan, dalam reaksi berantai, penyebab paket B
yang akan dimuat dan melekat juga. Fungsi dalam paket A
kemudian akan dapat menemukan fungsi dalam paket B
yang mereka andalkan.
Sebuah "Imports"
direktif akan memuat tetapi tidak melampirkan paket A
dan akan tidak beban atau melampirkan paket B
. ( "Imports"
, setelah semua, mengharapkan bahwa penulis paket menggunakan mekanisme namespace, dan paket itu A
akan menggunakan "Imports"
untuk menunjuk ke fungsi apa pun B
yang memerlukan akses.) Panggilan oleh fungsi Anda ke fungsi dalam paket A
yang bergantung pada fungsi dalam paket B
akan akibatnya gagal.
Hanya dua solusi untuk:
- Apakah paket Anda melampirkan paket
A
menggunakan "Depends"
arahan.
- Lebih baik dalam jangka panjang, hubungi pengelola paket
A
dan minta mereka untuk melakukan pekerjaan yang lebih hati-hati dalam membangun ruang nama mereka (dalam kata-kata Martin Morgan dalam jawaban terkait ini ).