Manual " Writing R Extensions " menyediakan panduan berikut tentang kapan harus menggunakan Impor atau Tergantung:
Aturan umum adalah
- Paket yang hanya memerlukan namespace untuk memuat paket menggunakan pkgname harus terdaftar di bidang 'Impor' dan bukan di bidang 'Tergantung'.
- Paket yang perlu dilampirkan untuk berhasil memuat paket menggunakan pkgname harus terdaftar di bidang 'Tergantung' saja.
Bisakah seseorang memberikan kejelasan lebih banyak tentang ini? Bagaimana saya tahu ketika paket saya hanya perlu ruang nama dimuat versus ketika saya perlu paket untuk dilampirkan? Apa contoh keduanya? Saya pikir paket tipikal hanyalah kumpulan fungsi yang terkadang memanggil fungsi dalam paket lain (di mana beberapa pekerjaan sudah dikodekan). Apakah skenario 1 atau 2 di atas?
Edit
Saya menulis posting blog dengan bagian tentang topik khusus ini (mencari 'Impor v Tergantung'). Visual membuatnya jauh lebih mudah untuk dipahami.
Jawaban:
"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 olehsearch()
). 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 paketgam
danmgcv
. Jika dua paket lain dimuat, satu tergantunggam
dan satu tergantungmgcv
, fungsi yang ditemukan oleh panggilangam()
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 membutuhkanimport
atauimportFrom
arahan dalamNAMESPACE
file), masalah akan diperbaiki dengan dua cara. (1) Paket itu sendiri akan mendapatkan kendali atasmgcv
fungsi yang digunakan. (2) Dengan menjaga jalur pencarian utama bersih dari objek yang diimpor, itu bahkan tidak akan berpotensi memecah ketergantungan paket lain padamgcv
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 lainB
, paket Anda mungkin akan perlu melampirkanA
dengan"Depends
direktif.Ini karena fungsi-fungsi dalam paket
A
ditulis dengan harapan bahwa paketB
dan fungsinya akan dilampirkan padasearch()
path .Sebuah
"Depends"
direktif akan memuat dan melampirkan paketA
, di mana titik paketA
's sendiri"Depends"
direktif akan, dalam reaksi berantai, penyebab paketB
yang akan dimuat dan melekat juga. Fungsi dalam paketA
kemudian akan dapat menemukan fungsi dalam paketB
yang mereka andalkan.Sebuah
"Imports"
direktif akan memuat tetapi tidak melampirkan paketA
dan akan tidak beban atau melampirkan paketB
. ("Imports"
, setelah semua, mengharapkan bahwa penulis paket menggunakan mekanisme namespace, dan paket ituA
akan menggunakan"Imports"
untuk menunjuk ke fungsi apa punB
yang memerlukan akses.) Panggilan oleh fungsi Anda ke fungsi dalam paketA
yang bergantung pada fungsi dalam paketB
akan akibatnya gagal.Hanya dua solusi untuk:
A
menggunakan"Depends"
arahan.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 ).sumber
Imports
danDepends
persyaratan versi wrt dan memeriksa contoh dalam.Rd
file memang halus dan patut diketahui.Imports: ggplot2
, mengapa paket saya tidak menemukanautoplot
fungsinya? JelasDepends
melampirkan pustaka paketggplot2
dan jadi tidak ada masalah. misalnya saya memiliki fungsiautoplot.myFunction()
yang menggunakan@import ggplot2
tag dan paket saya milikiImports: ggplot2
tetapi saya mendapatkan kesalahan:Error in eval(expr, envir, enclos) : could not find function "autoplot"
ketika saya mencoba menggunakannya.Depends
danImports
bagianDESCRIPTION
, dia benar-benar bertanya tentang apa yang "mengimpor" fungsi (bukan "tergantung" pada itu) berarti. Karena yang terakhir itu adalah pertanyaan yang saya coba jawab (dan - saya curiga - apa yang ingin diketahui oleh kebanyakan orang yang mencari jawaban ini), saya akan meninggalkan jawaban yang sebaliknya tidak berubah.Hadley Wickham memberikan penjelasan yang mudah ( http://r-pkgs.had.co.nz/namespace.html ):
sumber
Kamar di SfDA mengatakan untuk menggunakan 'Impor' ketika paket ini menggunakan mekanisme 'namespace' dan karena semua paket sekarang diharuskan memilikinya, maka jawabannya sekarang mungkin selalu menggunakan 'Impor'. Dalam paket-paket sebelumnya bisa dimuat tanpa benar-benar memiliki ruang nama dan dalam hal ini Anda harus menggunakan Depends.
sumber
<namespace:packageName>
, sebagai bagian dari<imports:packageName>
. Tidak ada panggilan lebih lanjutlibrary()
yang diperlukan, dan R tidak akan memberi tahu Anda di konsol pada waktu pemuatan paket kecualiImport
paket ed tidak dapat ditemukan.Berikut adalah pertanyaan sederhana untuk membantu Anda memutuskan mana yang akan digunakan:
Apakah paket Anda mengharuskan pengguna akhir untuk memiliki akses langsung ke fungsi-fungsi paket lain?
Satu-satunya waktu Anda harus menggunakan 'Tergantung' adalah ketika paket Anda merupakan add-on atau pendamping untuk paket lain, di mana pengguna akhir Anda akan menggunakan fungsi dari kedua paket Anda dan paket 'Tergantung' dalam kode mereka. Jika pengguna akhir Anda hanya akan berinteraksi dengan fungsi Anda, dan paket lainnya hanya akan melakukan pekerjaan di belakang layar, maka gunakan 'Impor' sebagai gantinya.
Peringatan untuk ini adalah bahwa jika Anda menambahkan paket ke 'Impor', seperti biasanya, kode Anda harus merujuk ke fungsi dari paket itu, menggunakan sintaks namespace lengkap, misalnya
dplyr::mutate()
, alih-alih adilmutate()
. Itu membuat kode sedikit clunkier untuk dibaca, tapi itu harga kecil untuk membayar paket kebersihan yang lebih baik.sumber