Создание функций пакета с тем же именем, что и существующий пакет - PullRequest
0 голосов
/ 13 июня 2019

Как большой сторонник грамматики dplyr, я создал пакет, который можно использовать для обработки класса, часто используемого в исследованиях (sumrizedExperiment, или se) с похожим синтаксисом. (название пакета очистить).

Я, например, определил новую filter функцию с именем filter.SummarizedExperiment, которая принимает se в качестве первого аргумента и определила функцию диспетчеризации как filter <- function(se, axis, ...){UseMethod("filter")}.

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

Есть ли способ, которым я могу настроить свой пакет так, чтобы исходная версия фрейма данных dplyr все еще могла использоваться , и диспетчер автоматически использует версию dplyr или cleanse в зависимости от того, является ли ее первый аргумент фрейм данных или SummarizedExperiment? Каков наилучший подход к этому?

PS1: мне известно о решении использования явного пространства имен, т. Е. С использованием dplyr :: filter, но хотелось бы найти решение, в котором диспетчеризация происходит автоматически на основе класса.
PS2: dplyr - это зависимость cleanse, поэтому у всех пользователей будет установлен dplyr.

1 Ответ

1 голос
/ 13 июня 2019

dplyr уже определяет универсальный для filter, поэтому просто определите свой собственный метод.Здесь мы возвращаем строку se при вызове filter для объекта se, поэтому заменим тело соответствующим образом в filter.se:

library(dplyr)
filter.se <- function(x, ...) "se"
filter.default <- filter.ts <- stats::filter

dplyr filter clobbers base R и в последней строкевыше, что является необязательным, исправляет это, но если вы его не используете, вам придется использовать stats::filter всякий раз, когда вы хотите использовать базу filter.

Проверьте это с помощью:

filter(BOD, Time < 5)
filter(1:5, 3)
filter(structure(1, class = "se"))
...