Подтвердить что ты не робот

Импорт двух функций с одинаковым именем с помощью 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

4b9b3361

Ответ 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 имя_папки имя_функции. Никакие запятые, скобки, ничто, только два имени, разделенные пробелом (возможно, применимы к более чем одной функции, очевидным образом).

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

Надеюсь, это поможет.