Р: Как лучше всего импортировать инфиксные операторы, такие как%>%, в мой пакет? - PullRequest
2 голосов
/ 25 сентября 2019

Я делаю R-пакет и борюсь с импортом таких инфиксных функций, как %>%, := или %dopar%.

В файле DESCRIPTION я используюImports: <otherPackage> (например, Imports: doParallel) понятие.В коде я использую понятие package::function() (например, dplyr::mutate()), которое, кажется, работает (R CMD check рад), но как мне импортировать инфиксные функции?

@importFrom (например, #' @importFrom magrittr %>%) Кажется, что способ roxygen работает для %>%, := и %dopar%.Но так как он скопирован в NAMSEPACE -файл, добавление @importFrom к одной функции решает проблему для всего пакета, которая выглядит довольно «хакерской».

Какова лучшая практика для импорта такихфункции в моем пакете?

1 Ответ

0 голосов
/ 26 сентября 2019

Я не уверен, есть ли единственная лучшая практика в этом случае.Использование @importFrom для обновления файла NAMESPACE действительно должно быть директивой для всего пакета, но я никогда не сталкивался с пакетом, у которого были проблемы с этим, или причинами, чтобы его избежать.Если хотите, вы можете аннотировать несколько функций одной и той же директивой @importFrom, указывая, какие функции используют, какие импортируют, и это не вызовет никаких конфликтов;это полностью зависит от вас, хотя, одного будет достаточно.Использование @import может вызывать недовольство , но я думаю, что это действительно зависит от того, какой пакет вы импортируете.

Исходя из вашего вопроса, я понимаю, что вы используете :: явно (что я бы лично сказалэто хорошая практика), и тогда вам даже не нужно изменять NAMESPACE.В большинстве случаев это было бы просто замечательно, хотя могут быть и особые случаи, которые обычно необходимо рассматривать индивидуально.Эти особые случаи, по крайней мере, по моему опыту, обычно связаны с обобщениями S4.

Возьмем, к примеру, функцию base::rowSums: это , а не обобщенная функция в base, ноесли присоединен пакет Matrix, rowSums «трансформируется» в универсальный S4, но в базовом пакете универсальным является , а не .Почему это так, выходит за рамки этого ответа (см. ?Methods_for_Nongenerics для получения дополнительной информации), но это означает, что если ваш пакет использует нотацию base::rowSums, он не отправляет методы из Matrix.Единственный способ поддержать оба случая (т. Е. Когда пользователь не использует Matrix и когда он используется) - использовать rowSums без base::.

Теперь, что касается инфиксных операторов, если выЕсли вы хотите использовать ::, вам нужно что-то вроде base::`%in%`("a", c("a", "b")), что, по сути, влечет за собой использование его как функции и потерю синтаксиса инфикса, чего вы, вероятно, не хотите.

Так что, если у вас нет оченьконкретные причины, чтобы избежать того или другого, просто используйте любые обозначения, которые вы предпочитаете.Лично я бы как можно больше придерживался ::, но никогда бы не использовал его для инфиксных операторов.

...