Импорт методов пакета S3 без импорта его функций - PullRequest
4 голосов
/ 08 января 2020

У меня есть следующая цепочка зависимостей в разрабатываемом пакете:

  • В моем пакете используется класс (trajectory), определенный в пакете A (simmer).
  • Он также использует метод S3 для этого класса (plot.trajectory), который определен в пакете B (simmer.plot).
  • Я могу импортировать пакет A в целом, но не могу импортировать пакет B в целом, поскольку он содержит замены для других функций, определенных в пакете A (функции get_mon), поэтому я получаю нежелательные предупреждения о замене исходных функций.

Как использовать / импортировать метод S3 без импорта остальной части пакета B, предпочтительно через roxygen2?

В документации roxygen2 предлагается следующее :

Если вы хотите чтобы добавить новый метод к S3 generi c, импортируйте его с помощью @importFrom pkg generi c.

Для моего примера это будет @importFrom simmer.plot plot, но это возвращает предупреждение о том, что plot не экспортируется simmer.plot. То же самое происходит, если я сначала импортирую шаблон c, используя @importFrom graphics plot.

Ответы [ 2 ]

2 голосов
/ 10 января 2020

Упоминание Иньяки Окара о теге @rawNamespace привело меня к разработке версии, которая не импортирует ни одну из экспортируемых функций пакета B, с использованием функции getNamespaceExports, упомянутой в этого ответа :

#' @rawNamespace import(packageB, except = getNamespaceExports("packageB"))

Тег @rawNamespace в roxygen2 вставляет необработанный код в файл NAMESPACE. getNamespaceExports возвращает имена всех экспортируемых функций в пространстве имен: это может быть пакет, который вы не прикрепили.

Для моего конкретного примера c я могу написать следующее:

#' @import simmer
#' @rawNamespace import(simmer.plot, except = getNamespaceExports("simmer.plot"))

, который помещает эти строки в NAMESPACE:

import(simmer)
import(simmer.plot, except = getNamespaceExports("simmer.plot"))
2 голосов
/ 09 января 2020

Используйте (см. this ):

#' @rawNamespace import(simmer, except=c(get_mon_arrivals, get_mon_resources, get_mon_attributes))
#' @import simmer.plot

, потому что вам действительно нужно использовать перегруженные функции в simmer.plot, чтобы там могли работать методы построения. Эквивалентная, но более короткая версия:

#' @rawNamespace import(simmer, except=getNamespaceExports("simmer.plot"))
#' @import simmer.plot
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...