2011-09-02 26 views
29

R的命名空間機制允許使用一個到export函數,這些函數對用戶是可見的。此外,它允許從其他軟件包的功能import。鑑於出口的利益是顯而易見的,我對理解進口的好處有更多的問題。在R中的命名空間導入有什麼好處?

一個好處似乎是,人們可以使用其他軟件包中的函數而無需附加軟件包,從而節省內存。這在1.6.4 in the writing R extensions manual部分中有例證。

但是,必須有導入功能的其他好處。特別是,section 1.6.6 (that deals with S4 classes)顯示stats4包的namespace

export(mle) 
importFrom("graphics", plot) 
importFrom("stats", optim, qchisq) 
## For these, we define methods or (AIC, BIC, nobs) an implicit generic: 
importFrom("stats", AIC, BIC, coef, confint, logLik, nobs, profile, 
      update, vcov) 
exportClasses(mle, profile.mle, summary.mle) 
## All methods for imported generics: 
exportMethods(coef, confint, logLik, plot, profile, summary, show, update, vcov) 
## implicit generics which do not have any methods here 
export(AIC, BIC, nobs) 

在這裏有進口的函數,它們既不S4類也不泛型(它將使意義使用進口以及,如在that section記錄在示例) ,但功能如graphics程序包中的plot這些程序包在R啓動時自動加載。

因此,我的問題是,導入功能如plot,optimqchisq有什麼好處?

回答

23

如果從包Bar導入功能foo,則無論用戶對其搜索路徑做了什麼,例如通過附加也具有功能foo功能的包Baz,都可以找到它。如果沒有名稱空間,程序包代碼會突然發現使用了Baz::foo。還有效率問題(foo立即找到,而不是搜索搜索路徑上的所有符號後),但這些對於大多數應用程序來說可能是微不足道的。同樣,importFromimport是一個改進,因爲碰撞(或使用非預期功能)更少,查找效率更高。

隨着S4(和S3)事情會變得相當複雜。像graphics::plot這樣的非泛型函數可以在兩個不同的包中升級爲通用(與setGeneric),並且每個泛型都可以有其自己的一組方法。軟件包作者希望精確地知道哪些是泛型的,以及哪些方法派發表,它們的類和方法可以看到。

調用函數pkg::foo總是解析爲預期的功能。它要求將pkg列在DESCRIPTION文件的Depends:字段中(可能在Imports中:但它似乎是誤導性的廣告而不是從pkg導入),污染了用戶的搜索路徑。它還涉及兩個符號查找和函數調用(::),所以效率較低。懶惰和缺乏注意力到細節部分我也看到使用::乏味和容易出錯。

封裝codetoolsBioC(經由與用戶名和密碼readonly SVN)可以從現有封裝的NAMESPACE文件(或至少它可以最近的變化到R-devel的前引入上包一個NAMESPACE在沒有一個;我沒有在這樣的包上嘗試了codetoolsBioC)。

+0

這意味着,如果想將其推廣到泛型,那麼導入這樣的函數纔有意義? (如果想要假設搜索路徑中沒有其他函數叫做'plot') – Henrik

+2

從程序包使用的導入函數(從基地以外的軟件包始終可用)總是有意義的,否則當一些第三包定義了一個函數'plot = function(...)「我有一個很好的故事來告訴你'你的代碼中斷了。用戶無法控制搜索路徑。 –

+0

然而,如果我總是使用'::'運算符調用一個函數(例如,總是'graphics :: plot()'而不是'plot()'),如果已經連接了一個包,還有導入的好處嗎? – Henrik

相關問題