27

我是 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 和 scales 包以及 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

并将其添加到一些 .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'simportFrom标签?

我已阅读: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 存储库

4

3 回答 3

24

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

假设有两个包 pkgA 和 pkgB,它们都导出了一个名为 foo 的函数。如果您创建一个包 pkgC,它在 NAMESPACE中具有import(pkgA)和 。import(pkgB)现在,当您打电话时,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”(和其他函数)。在上面的示例中,pkgD 的 NAMESPACE 应该是

importFrom(pkgB,foo)

如果您确实需要从两个不同的包中使用具有相同名称的两个函数,您可以执行的一种技巧是从每个包中导入其他函数以确保安装包并加载它们的命名空间,然后参考您的函数需要::通过将其放置在您的 NAMESPACE 中来使用符号:

importFrom(pkgA,foo)
importFrom(pkgB,bar)

然后在你的代码中pkgA::abc()调用函数。pkgB::abc()

于 2013-08-23T13:01:32.203 回答
4

很可能不再对您有用,但可能对其他人有用:您的问题的答案可以在您提到的网站中找到,特别是在这里(引用来源):“无论您使用多少次@importFrom foo bar” .

所以 roxygen2 的标签 @importFrom 的正确用法是:@importFrom package_name function_name。没有逗号,括号,什么都没有,只有用空格分隔的两个名称(很明显,可能适用于多个函数)。

我刚刚在为我的一个包的新版本生成文档时自己尝试过这个,所以它应该可以工作。

我希望它有所帮助。

于 2016-08-17T16:12:19.100 回答
2

最近我找到了解决这个问题的新方法。我想在开发中导入 dplyr 和 data.table 来给出这些警告。为了删除重叠函数,我使用 importFrom 来导入 data.table 中除重叠之外的每个函数。

ls("package:data.table") %>% 
  setdiff(c("last","first","between",":=")) %>% 
  str_c(collapse = " ")

## "%between% %chin% %flike% %ilike% %inrange% %like% address alloc.col as.data.table as.Date.IDate as.IDate as.ITime as.xts.data.table chgroup chmatch chorder CJ copy cube data.table dcast dcast.data.table fcoalesce fifelse fintersect foverlaps frank frankv fread frollapply frollmean frollsum fsetdiff fsetequal fsort funion fwrite getDTthreads getNumericRounding groupingsets haskey hour IDateTime indices inrange is.data.table isoweek key key<- key2 like mday melt melt.data.table merge.data.table minute month nafill quarter rbindlist rleid rleidv rollup rowid rowidv second set set2key set2keyv setalloccol setattr setcolorder setDF setDT setDTthreads setindex setindexv setkey setkeyv setnafill setnames setNumericRounding setorder setorderv shift shouldPrint SJ tables test.data.table timetaken transpose truelength tstrsplit uniqueN update.dev.pkg wday week yday year"

setdiff 已包含所有冲突的函数名称。最后我 importFrom data.table 只有上面的功能。

于 2019-12-06T13:29:08.187 回答