使用roxygen2导入两个具有相同名称的函数

Tyl*_*ker 22 r package 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’
Run Code Online (Sandbox Code Playgroud)

因为我使用plotrix和scale包以及NLP和ggplot包.他们具备的功能rescaleannotate共同点.这会导致最新的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 <tyler.rinker@gmail.com>
Depends:
    R (>= 3.0.0),
    ggplot2 (>= 0.9.3.1),
    gdata,
    grid,
Imports:
    NLP,
    openNLP,
    plotrix,
    scales,
LazyData: TRUE
Description: Stuff
License: GPL-2
Run Code Online (Sandbox Code Playgroud)

并将其添加到一些.R文件中:

#' @import ggplot2 gridExtra RColorBrewer
#' @importFrom scales alpha
Run Code Online (Sandbox Code Playgroud)

但这会导致另一个警告:

* 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'
Run Code Online (Sandbox Code Playgroud)

如何使用roxygen2importFrom标签是否正确?

我看过: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’
Run Code Online (Sandbox Code Playgroud)

这是qdap GitHub Repo

GSe*_*See 21

要记住的是,在包的命名空间中不能有多个具有相同名称的函数.

假设有两个包pkgA和pkgB,它们都导出一个名为foo的函数.如果您创建一个包,pkgC,拥有import(pkgA)import(pkgB)在命名空间.现在,当你打电话给library(pkgC)你时会收到警告:

replacing previous import 'foo' when loading 'pkgB'. 
Run Code Online (Sandbox Code Playgroud)

现在,假设某人在NAMESPACE文件中创建了另一个包pkgD:

import(pkgA)
import(pkgB)
import(pkgC)
Run Code Online (Sandbox Code Playgroud)

然后,library(pkgD)将给出2个警告:

1: replacing previous import ‘foo’ when loading ‘pkgB’ 
2: replacing previous import ‘foo’ when loading ‘pkgB’ 
Run Code Online (Sandbox Code Playgroud)

如果每个人都采用导入整个命名空间的做法,那么从现在起30年后,会有很多这些警告.

相反,由于您的包中只能有一个"foo",因此您应该明确地导入您希望包使用的"foo"(以及其他功能).在上面的例子中,pkgD的NAMESPACE应该是

importFrom(pkgB,foo)
Run Code Online (Sandbox Code Playgroud)

如果你真的需要在两个不同的包中使用同名的两个函数,你可以执行的一个hack是从每个包导入其他函数以确保安装包并加载它们的命名空间,但是然后参考你的函数需要::在你的NAMESPACE中使用符号:

importFrom(pkgA,foo)
importFrom(pkgB,bar)
Run Code Online (Sandbox Code Playgroud)

然后调用函数pkgA::abc()pkgB::abc()代码.

  • @geneorama 你可以使用 `pkgA::foo()` 从 `pkgA` 访问 `foo`,但它不会将它导入你的包的命名空间。包的命名空间不能有多个同名的函数。 (2认同)