7.3 命名空间

来源:互联网 发布:java whi循环99乘法表 编辑:程序博客网 时间:2024/06/10 18:16

7.3 命名空间

命名空间对于面向对象真的并没有要做的.对于比较随意的使用者,这些看起来像是一个不必要的并发症,同时看起来像是复杂性实际是由简单性伪装而成.

假设有两个都有一个recode()函数.你希望使用两个中的一个.但是并不会保证你想要的那个总是被首先查找到.这就是命名空间存在的答案.

为了理解命名空间,我们考虑一个返回一个命名列表的函数.在命名空间中这里有这个函数的一些东西你可以看到(它返回的组件),还有一些对象你无法看到(在函数中被创建但是没有返回的).一个命名空间输出了一个或者多个对象,这些是可见的,但是或许还有一些对象时私有的.

查看一个特定命名空间的对象可以使用 ’ :: ‘ 操作:

> stats::coeffunction (object, ...)UseMethod("coef")<environment: namespace:stats>  

如果这个名字没有被输出那么这个操作就会失败:

> stats::coef.defaultError: ’coef.default’ is not an exported objectfrom ’namespace:stats’

这里也有方法去获得没有被输出对象的信息,但是你得答应除了看看之外不能使用它们.你可以使用’ ::: ‘或者getAnywhere():

> stats:::coef.defaultfunction (object, ...)object$coefficients<environment: namespace:stats>> getAnywhere(’coef.default’)A single object matching ’coef.default’ was foundIt was found in the following placesregistered S3 method for coef from namespace statsnamespace:statswith valuefunction (object, ...)object$coefficients<environment: namespace:stats>

如果你想修改命名空间的一个函数就会有一些问题.这种情况下,assignInNamespace()和unlockBinding()将会是有用的.

命名空间,S3方法,尤其是S4方法的存在使R对于大的复杂的应用比用它的其他方式要更加合适.但R并不是对于任何应用都是最好的工具.它也没有努力去这样做.R的一个设计理想是使R和其他软件的交互更加方便以使每个任务都会得到最好的工具.

0 0
原创粉丝点击