2011-09-02 29 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

相关问题