的R的命名空间用作用于在其相关联的包中的所有的功能的直接环境。 换句话说,当功能bar()
从软件包foo调用另一个函数,将R评估器首先搜索在其它功能<environment: namespace:foo>
那么在"imports.foo"
, <environment: namespace:base>
, <environment: R_GlobalEnv>
等等往下通过键入返回的搜索列表search()
命名空间的一个好的方面是,它们可以使封装像更好的公民:在未导出的函数<environment: namespace:foo>
在功能和imports:foo
仅适用:(a)以FOO功能; (b)向来自FOO导入其他包; 或(c)通过完全合格的函数调用像foo:::bar()
我这样想着,直到最近...
行为
最近的这次SO问题突出,其中一个功能完善的隐藏在其包装的命名空间通过一个看似不相关的函数调用中仍然发现了一个情况:
group <- c("C","F","D","B","A","E")
num <- c(12,11,7,7,2,1)
data <- data.frame(group,num)
## Evaluated **before** attaching 'gmodels' package
T1 <- transform(data, group = reorder(group,-num))
## Evaluated **after** attaching 'gmodels
library(gmodels)
T2 <- transform(data, group = reorder(group,-num))
identical(T1, T2)
# [1] FALSE
其直接原因
@Andrie通过指出回答原来的问题,从该包GDATA,其包括功能gmodels进口reorder.factor
其被分派到第二呼叫内部transform()
T1
不同于T2
,因为第一通过下式计算stats:::reorder.default()
和所述第二通过gdata:::reorder.factor()
我的问题
它是如何在上面调用的transform(data, group=reorder(...))
用于调度机制reorder
的发现,然后分发到gdata:::reorder.factor()
(安的回答应包括的范围规则,从涉及的统计信息和基本包在GDATA一个看似很好的隐蔽方法函数的调用导致的解释。)
另外可能有帮助的细节
无论是
gdata:::reorder.factor
,也不是GDATA包作为一个整体被明确gmodels进口。 下面是import*
在gmodels' 命名空间文件指令:importFrom(MASS, ginv) importFrom(gdata, frameApply) importFrom(gdata, nobs)
存在用于任何方法
reorder()
或transform()
在<environment: namespace:gmodels>
也不在"imports:gmodels"
:ls(getNamespace("gmodels")) ls(parent.env(getNamespace("gmodels")))
卸下gmodels不会恢复
reorder()
的行为:gdata:::reorder.factor()
仍然被分派:detach("package:gmodels") T3 <- transform(data, group=reorder(group,-num)) identical(T3, T2) # [1] TRUE
reorder.factor()
没有被存储在在基础环境S3方法的列表:grep("reorder", ls(.__S3MethodsTable__.)) # integer(0)
从过去几天的[R聊天线程包括一些额外的想法。 由于Andrie,布莱恩·迪格斯,和Gavin辛普森谁(与别人)应随意编辑或添加可能IMPT。 细节这个问题。