jub*_*uba 38 namespaces r
假设我正在开发一个名为的包,foo它希望使用包中的description函数memisc.我不想导入整个memisc命名空间,因为:
memisc覆盖基本aggregate.formula函数,它打破了几件事.例如,example(aggregate) 会悲惨地失败.该软件包包括以下文件:
描述
Package: foo
Version: 0.0
Title: Foo
Imports:
memisc
Collate:
'foo.R'
Run Code Online (Sandbox Code Playgroud)
NAMESPACE
export(bar)
importFrom(memisc,description)
Run Code Online (Sandbox Code Playgroud)
R/foo.R
##' bar function
##'
##' @param x something
##' @return nothing
##' @importFrom memisc description
##' @export
`bar` <- function(x) {
description(x)
}
Run Code Online (Sandbox Code Playgroud)
我认为使用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
Run Code Online (Sandbox Code Playgroud)
所以,你知道如何description在memisc不进入aggregate.formula我的环境的情况下导入函数吗?
Bri*_*ggs 26
你不能.
如果memisc在Imports:字段中声明,则在加载包时将加载命名空间,并且包可以找到导出的对象.(如果将其指定Depends:,则命名空间将被加载并附加到搜索路径,这使得任何代码都可以找到导出的对象.)
加载命名空间的一部分是使用泛型注册方法.(我看了但是找不到一个说明这一点的规范文档;我将呼吁将函数声明为NAMESPACE文件中的S3方法作为证据.)定义的方法与泛型保持一致并具有通用的可见性函数(或者,也许是泛型函数的命名空间).
通常,包将为其创建的泛型或其定义的类定义方法.S3对象系统没有正式定义S3类(或者创建类的包)的机制,但一般的想法是如果包定义了返回具有该类属性的对象的函数(并且是唯一的包),那个类就是那个包的类.如果这两个条件中的任何一个成立,就不会有问题.如果在包中定义了泛型,则只有在附加包时才能找到它; 如果在包中定义了类,则只有在附加和使用包时,该类的对象才会存在(因此将被调度).
在这个memisc例子中,两者都没有.该aggregate通用的是在所定义的stats包和formula目的还在所定义的stats包(基于该包限定as.formula,[.formula等)由于它是既不memisc的通用也不memisc的目的,效果可以甚至看到(和方法指派如果memisc只是装载但没有附加.
有关此问题的另一个示例,但是reorder.factor,请参阅重新排序因子给出不同的结果,具体取决于加载的包.
通常,将包方法不能控制对象或泛型的泛型方法添加到一起是不好的做法.如果它覆盖了核心包中的方法,那么加倍; 如果它不是核心包中现有功能的向后兼容功能,那就太过分了.
对于您的示例,您可能最好将代码复制memisc::describe到您的包中,尽管该方法有其自身的问题和警告.
需要注意的是,我不太熟悉 R 环境和命名空间,也不知道这是否适用于包——我在编程中使用的一种解决方法是::将函数复制到我自己的函数中。
正如对 OP 问题的评论中所讨论的那样,加载整个包可能会产生未知的后果,但它似乎没有将包的函数名称附加到 R 命名空间并屏蔽现有的函数名称。
例子:
my_memisc_description <- memisc::description