Saya ingin menggunakan operator pipa yang %>%
diperkenalkan dalam magrittr
paket dalam paket yang saya tulis sendiri untuk dplyr
transformasi data berantai . magrittr
terdaftar seperti Import
pada DESCRIPTION
file. Setelah memuat paket saya sendiri dan menguji fungsi yang menggunakan operator pipa, saya mendapatkan pesan kesalahan berikut:
Kesalahan dalam nama fungsi (parameter,: tidak dapat menemukan fungsi "%>%"
Mengubah %>%
ke magrittr::%>%
dalam kode sumber fungsi juga tidak membantu karena paket tersebut tidak dapat dibuat lagi.
r
namespaces
magrittr
alexander keth
sumber
sumber
Jawaban:
Seharusnya berfungsi dengan benar jika Anda telah
magrittr
mendaftar diDepends
. Namun, hal ini tidak disarankan . Sebaliknya, Anda meninggalkanmagrittr
diImports
dan tambahkan baris berikut keNAMESPACE
:Saya sarankan membaca ekstensi Menulis R . Pertanyaan Anda tercakup dalam paragraf 1.1.3 dan 1.5.1.
sumber
roxygen2
, Anda dapat menambahkan#' importFrom magrittr "%>%"
agar NAMESPACE terisi secara otomatis selamaroxygenize()
.#' @importFrom magrittr "%>%"
%>%
internal dalam paket Anda. Jika API Anda mengharuskan pengguna untuk merangkai fungsi menggunakan%>%
, mereka masih harus memuat secara eksplisitmagrittr
. Salah satu cara untuk mengatasi masalah ini adalah mengekspor ulang fungsinya. Berikut ini contoh cara melakukannya.Sekarang ada cara yang lebih mudah untuk mendukung pipa di paket Anda. Paket yang luar biasa
usethis
memiliki fungsinyause_pipe()
. Anda menjalankan fungsi itu sekali dan itu menangani semuanya. Beginilahuse_pipe()
fungsi dijelaskan dalamusethis
dokumentasi:sumber
use_pipe()
ke kode yang Anda gunakan untuk membuat paket? Sebagai contoh, saya menjalankan:usethis::use_description(usethis_description); usethis::use_build_ignore(directories); usethis::use_build_ignore(paste0(pkg_name, ".Rproj")); if (file.exists(file.path(pkg_path, "NAMESPACE"))) { file.remove(file.path(pkg_path, "NAMESPACE")) }; devtools::document(pkg_path); devtools::check(pkg_path); devtools::load_all(pkg_path); devtools::install(pkg_path)
. Apakah saya akan menambahkanuse_pipe()
di awal?usethis
fungsi satu kali saat Anda mengembangkan paket. Fungsi-fungsi tersebut kemudian menambahkan bagian yang diperlukan ke instruksi build dan yang lainnya.Satu solusi tambahan - gunakan
roxygen
paketnya. Ini diimplementasikan sebagai bagian daridevtools
paket. Setelahdevtools
dipasang, panggilandevtools::document()
akan memperbarui fileNAMESPACE
untuk Anda. Itu juga secara otomatis membangun file .Rd dengan dokumentasi, yang berguna.Yang Anda lakukan hanyalah menambahkan komentar khusus dalam format
#' @import packagename
ke file untuk mengimpor semua fungsi dari paket itu, atau#' @importFrom packagename functionname
untuk mengimpor fungsi. Anda dapat memiliki komentar ini sebanyak yang Anda inginkan di file Anda, sehingga Anda dapat memiliki satu set komentar di bagian atas setiap file, atau dengan setiap fungsi Anda yang memerlukan fungsi eksternal.Kemudian Anda menjalankan
devtools::document()
dan mem-parsing kode Anda mencari komentar tersebut, dan kemudian membuatNAMESPACE
file yang sesuai untuk Anda. Mudah.sumber
Dengan asumsi Anda menggunakan RStudio,
devtools
paket Hadley , dan terdaftarmagrittr
di bagian ImporDESCRIPTION
file, berikut adalah langkah-langkah yang saya lakukan untuk membuatnya.%>%
fungsi paket saya berfungsi.Pertama, tulis fungsi
foo.R
:Kedua, lari
devtools::document()
.Ketiga, lari
devtools::load_all()
.File seperti ini akan dibuat di
R/
direktori Anda dan fungsi Anda akan berfungsi seperti yang diharapkan.sumber
@name %>%
disini?