【发布时间】:2013-11-19 05:47:24
【问题描述】:
假设我正在开发一个名为foo 的包,它想使用memisc 包中的description 函数。我不想导入整个 memisc 命名空间,因为:
- 很糟糕
-
memisc覆盖了基本的aggregate.formula函数,这破坏了几件事。例如,example(aggregate)会惨遭失败。
该软件包包括以下文件:
描述
Package: foo
Version: 0.0
Title: Foo
Imports:
memisc
Collate:
'foo.R'
命名空间
export(bar)
importFrom(memisc,description)
R/foo.R
##' bar function
##'
##' @param x something
##' @return nothing
##' @importFrom memisc description
##' @export
`bar` <- function(x) {
description(x)
}
我认为使用importFrom 不会加载整个memisc 命名空间,而只会加载namespace::description,但事实并非如此。从香草 R 开始:
R> getS3method("aggregate","formula")
## ... function code ...
## <environment: namespace:stats>
R> library(foo)
R> getS3method("aggregate","formula")
## ... function code ...
## <environment: namespace:memisc>
R> example(aggregate)
## Fails
那么,您知道如何在我的环境中不获取aggregate.formula 的情况下从memisc 导入description 函数吗?
【问题讨论】:
-
@HongOoi 不,这行不通。
::手册页说使用它会加载整个命名空间,我已经测试过了。 -
@HongOoi 您可以在 R vanilla 会话中尝试以下操作,您仍然会从
memisc获得aggregate.formula:memisc::description ; getS3method("aggregate","formula")。 -
我想知道这里的实际问题在多大程度上只是 memisc 作者不应该掩盖
aggregate.formula。 -
@joran 完全同意你的看法。至少,对我来说,这将是一个很好的提醒,永远不要覆盖基本函数。
-
无法从命名空间加载单个函数(不加载命名空间),因为 R 无法知道该函数需要哪些其他函数。
标签: r namespaces