7.3 命名空間

7.3 命名空間

命名空間對於面向對象真的並沒有要做的.對於比較隨意的使用者,這些看起來像是一個不必要的併發症,同時看起來像是複雜性實際是由簡單性僞裝而成.

假設有兩個都有一個recode()函數.你希望使用兩個中的一個.但是並不會保證你想要的那個總是被首先查找到.這就是命名空間存在的答案.

爲了理解命名空間,我們考慮一個返回一個命名列表的函數.在命名空間中這裏有這個函數的一些東西你可以看到(它返回的組件),還有一些對象你無法看到(在函數中被創建但是沒有返回的).一個命名空間輸出了一個或者多個對象,這些是可見的,但是或許還有一些對象時私有的.

查看一個特定命名空間的對象可以使用 ’ :: ‘ 操作:

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

如果這個名字沒有被輸出那麼這個操作就會失敗:

> stats::coef.default
Error: ’coef.default’ is not an exported object
from ’namespace:stats’

這裏也有方法去獲得沒有被輸出對象的信息,但是你得答應除了看看之外不能使用它們.你可以使用’ ::: ‘或者getAnywhere():

> stats:::coef.default
function (object, ...)
object$coefficients
<environment: namespace:stats>
> getAnywhere(’coef.default’)
A single object matching ’coef.default’ was found
It was found in the following places
registered S3 method for coef from namespace stats
namespace:stats
with value
function (object, ...)
object$coefficients
<environment: namespace:stats>

如果你想修改命名空間的一個函數就會有一些問題.這種情況下,assignInNamespace()和unlockBinding()將會是有用的.

命名空間,S3方法,尤其是S4方法的存在使R對於大的複雜的應用比用它的其他方式要更加合適.但R並不是對於任何應用都是最好的工具.它也沒有努力去這樣做.R的一個設計理想是使R和其他軟件的交互更加方便以使每個任務都會得到最好的工具.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章