Pertanyaan Fungsi penamaan untuk paket R


Saya menulis paket R dan benar-benar ingin menghindari menggunakan nama fungsi yang ditemukan dalam paket lain. Sebagai contoh, saya berencana untuk memanggil fungsi 'annotate', tetapi ini telah digunakan dalam paket NLP. Jelaslah yang terbaik untuk menghindari pilihan nama yang jelas, tetapi apakah ada cara sistematis untuk mencari daftar lengkap nama fungsi yang diterbitkan CRAN untuk menghindari duplikasi? Saya menghargai ini terutama penting untuk paket bersama CRAN tetapi juga bisa relevan ketika berbagi secara lokal hanya jika ada konflik dengan paket lain yang dimuat.


5
2017-08-22 15:14


asal


Jawaban:


Bentrokan nama terjadi ketika dua paket dimuat yang berisi fungsi dengan nama yang sama. Jadi, nama bentrokan dapat dihindari di dua tempat:

  • ketika mendefinisikan nama fungsi dalam suatu paket
  • saat memanggil fungsi dari paket

Membuat fungsi dengan nama yang unik

Pada saat penulisan (23 Agustus 2017), jumlah paket 11272 yang luar biasa tersedia di CRAN (Angka terbaru dapat ditemukan sini) dan paket baru sedang ditambahkan setiap hari.

Jadi, buat nama fungsi yang unik hari ini dapat menyebabkan bentrokan nama di masa depan ketika paket lain akan ditambahkan.

Alistaire sudah disebutkan opsi untuk awalan semua fungsi Anda. Selain stringi dan stringr, yang forcats paket adalah contoh lain yang menggunakan awalan fct_ dan lvls_.

Pendekatan ini dapat mengurangi kemungkinan terjadinya bentrokan nama.

(Meskipun tidak ada jaminan bahwa tidak ada pengelola paket lain yang dapat memilih awalan yang sama.)

Memanggil fungsi dengan jelas menggunakan operator kolon ganda

IMHO, tanggung jawab utama untuk menghindari bentrokan nama adalah pengguna.

Saya telah melihat pertanyaan di sini di SO dengan lebih dari setengah lusin paket sedang dimuat. Atau, library(tidyverse) disebut untuk kenyamanan, yang memuat 19 paket lainnya di mana dplyrdan tidyr sudah cukup.

Mengacaukan namespace dengan banyak paket yang dimuat meningkatkan risiko bentrokan nama. Dan bahkan dengan hanya dua paket yang dimuat, mungkin terjadi bentrokan nama. Misalnya, lubridate dan data.table paket keduanya telah ditentukan

hour, isoweek, mday, minute, month, quarter, second, wday, week, yday, year

Fungsi mana yang dipanggil akan tergantung pada pesanan paket-paket yang telah dimuat. (Anda dapat menggunakan conflicts() untuk menemukan objek yang ada dengan nama yang sama di dua atau lebih tempat di jalur pencarian.)

Untuk menghindari ambiguitas dan hasil yang tidak diharapkan, saya menyarankan untuk memuat paket sesedikit mungkin dan menggunakan operator kolon ganda ?"::" untuk memanggil fungsi dari paket tanpa memuat paket sebelumnya, misalnya,

library(data.table)
DT <- data.table(t = lubridate::now() + 0:3)
# call function from loaded package data.table
DT[, second(t)] 
[1] 18 19 20 21
# call function from lubridate package
DT[, lubridate::second(t)]
[1] 18.88337 19.88337 20.88337 21.88337

Ada manfaat lain dari menggunakan operator kolon ganda. Ini akan berfungsi sebagai dokumentasi dalam kode dari paket mana suatu fungsi dipanggil.

Hal ini terjadi dengan mengorbankan beberapa goresan kunci tambahan tetapi dapat menghemat banyak waktu ketika kode diperiksa, diubah, atau ditunda minggu atau tahun kemudian. Saya telah melihat banyak pertanyaan di SO di mana OP belum menyebutkan paketnya.


4
2017-08-23 08:09