Импорт двух функций с одинаковым именем с помощью roxygen2
Я поддерживаю пакет CRAN и при загрузке получаю следующие сообщения:
* checking whether package ‘qdap’ can be installed ... [10s/10s] WARNING
Found the following significant warnings:
Warning: replacing previous import ‘annotate’ when loading ‘NLP’
Warning: replacing previous import ‘rescale’ when loading ‘scales’
Потому что я использую пакеты plotrix и scale, а также пакеты NLP и ggplot. Они имеют функции rescale
и annotate
. Это приводит к значительному предупреждению с последней проверкой CRAN. Поэтому я решил "исправить" его.
Я сделал описание примерно так:
Package: qdap
Type: Package
Title: Bridging the gap between qualitative data and quantitative analysis
Version: 1.0.0
Date: 2013-06-26
Author: Tyler Rinker
Maintainer: Tyler Rinker <[email protected]>
Depends:
R (>= 3.0.0),
ggplot2 (>= 0.9.3.1),
gdata,
grid,
Imports:
NLP,
openNLP,
plotrix,
scales,
LazyData: TRUE
Description: Stuff
License: GPL-2
И добавил это в некоторые .R файлы:
#' @import ggplot2 gridExtra RColorBrewer
#' @importFrom scales alpha
Но это приводит к другому предупреждению:
* installing *source* package 'qdap' ...
** R
** data
*** moving datasets to lazyload DB
** inst
** preparing package for lazy loading
Warning: replacing previous import 'rescale' when loading 'scales'
Warning: replacing previous import 'annotate' when loading 'NLP'
Warning: replacing previous import 'alpha' when loading 'scales'
Как правильно использовать тег roxygen2
importFrom
?
Я читал: https://github.com/hadley/devtools/wiki/Namespaces
Но я лучше всего учусь из примера, когда кто-то должен был это сделать. Я не уверен, как правильно отформатировать файл DESCRIPTION, а также использовать теги roxygen2
, чтобы избежать:
* checking whether package ‘qdap’ can be installed ... [10s/10s] WARNING
Found the following significant warnings:
Warning: replacing previous import ‘annotate’ when loading ‘NLP’
Warning: replacing previous import ‘rescale’ when loading ‘scales’
Вот qdap GitHub Repo
Ответы
Ответ 1
Следует иметь в виду, что у вас не может быть более одной функции с
одно и то же имя в пространстве имен пакетов.
Предположим, что есть два пакета pkgA и pkgB, которые оба экспортируют функцию
называется foo. Если вы создаете пакет pkgC, который имеет import(pkgA)
и
import(pkgB)
в NAMESPACE. Теперь, когда вы звоните library(pkgC)
, вы получите
предупреждение:
replacing previous import 'foo' when loading 'pkgB'.
Теперь предположим, что кто-то создает другой пакет pkgD, который имеет это в файле NAMESPACE:
import(pkgA)
import(pkgB)
import(pkgC)
Затем library(pkgD
) выдаст 2 предупреждения:
1: replacing previous import ‘foo’ when loading ‘pkgB’
2: replacing previous import ‘foo’ when loading ‘pkgB’
Если каждый принимает практику импорта целых пространств имен, то 30 лет
отныне будет много этих предупреждений.
Вместо этого, поскольку у вас может быть только один "foo" в вашем пакете, вы должны
явно импортировать "foo" (и другие функции), которые вы хотите, чтобы ваш пакет
использовать. В приведенном выше примере NAMESPACE для pkgD должен быть
importFrom(pkgB,foo)
Если вам действительно нужно использовать две функции с одним и тем же именем из двух разных пакетов, один взлом, который вы можете выполнить, - это импортировать другие функции из каждого пакета, чтобы гарантировать, что пакеты установлены и их пространства имен загружены, но затем обратитесь к функции, которые вам нужны, используя обозначение ::
, поместив это в свой NAMESPACE:
importFrom(pkgA,foo)
importFrom(pkgB,bar)
а затем вызывающие функции pkgA::abc()
и pkgB::abc()
в вашем коде.
Ответ 2
Скорее всего, вам больше не нужно, а, возможно, другим: ответ на ваш вопрос можно найти на веб-сайте, о котором вы упоминаете, в частности, здесь (цитата из источника):
"Независимо от того, сколько раз вы используете @importFrom foo bar".
Итак, правильное использование тега roxygen2 @importFrom: @importFrom имя_папки имя_функции. Никакие запятые, скобки, ничто, только два имени, разделенные пробелом (возможно, применимы к более чем одной функции, очевидным образом).
Я пробовал это сам сейчас, когда создаю документацию для новой версии одного из моих пакетов, поэтому он должен работать.
Надеюсь, это поможет.