【问题标题】:import all the functions of a package except one when building a package在构建包时导入包的所有功能,除了一个
【发布时间】:2019-01-24 17:20:30
【问题描述】:

我正在构建一个导入 data.table 和另一个包(我们称之为 myotherpackage)的 R 包 (mypackage)。

Imports: data.table, myotherpackagemypackage 的说明文件中。

myotherpackage 导入 dplyr,它有几个函数命名为 data.table 函数,所以每次我加载 mypackage 时都会收到这样的警告:

Warning: replacing previous import ‘data.table::first’ by ‘dplyr::first’ when loading ‘mypackage’

有没有办法导入 data.table 的所有功能,例如“first”除外?如果我需要使用它,我会在代码中使用 data.table::first 。 或者有没有更好的方法来处理它?每次有人导入包时,我都试图避免警告。谢谢!

【问题讨论】:

  • 在您的 NAMESPACE 中使用 importFrom(my other package, function) 指令,而不是从包中导入所有函数。
  • 谢谢@Thomas。我希望有一种替代方法来指定我要导入的每个 data.table 函数(几乎是所有函数)。看来我倒霉了。
  • 您也可以指定import(data.table, except=c(foo))。见cran.r-project.org/doc/manuals/r-devel/…。不过,我不知道您是否可以使用 roxygen 标记来获得它。
  • 是的! @Thomas,它奏效了!我必须在函数描述中使用以下语法(而不是 #' @import data.table):#' @rawNamespace import(data.table, except = first) 你想回答这个问题以便我给你信用吗?

标签: r import dependencies r-package


【解决方案1】:

NAMESPACE 文件在这里有些灵活,如Writing R Extensions 中所述。

两个主要的导入指令是:

import(PACKAGE)

它将命名空间中的所有对象导入到您的包中。第二种选择是使用以下方法进行特定的导入:

importFrom(PACKAGE, foo)

这使您可以访问foo(),而无需完全限定的参考PACKAGE::foo()

但这并不是唯一的两个选择。您还可以使用 except 参数来排除少数导入:

import(PACKAGE, except=c(foo,bar))

它为您提供 PACKAGE 命名空间中的所有内容,但 foo()bar() 除外。这对于避免冲突很有用 - 就像你的情况一样。

对于 roxygen,弄清楚你可以做到这一点非常棒:

#' @rawNamespace import(PACKAGE, except = foo)

通过 roxygen 传递一个原始的 NAMESPACE 指令。

【讨论】:

  • 谢谢!为了澄清在需要包的函数的顶部,我放了@rawNamespace import(PACKAGE, except = foo)而不是@import PACKAGE
猜你喜欢
  • 2017-02-23
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 2017-01-23
相关资源
最近更新 更多