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包.他们具备的功能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 <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)
如何使用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’
Run Code Online (Sandbox Code Playgroud)
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()
代码.