在R中的命名空间中导入有什么好处?

Hen*_*rik 29 namespaces r package

R的命名空间机制允许一个export用户可见的功能.此外,它允许import从其他包中起作用.虽然出口的好处是显而易见的,但我在理解进口的好处方面存在更多问题.

似乎有一个好处是,可以使用其他软件包中的函数而无需附加软件包,从而节省内存.这在写作R扩展手册的1.6.4节中有所例证.

但是,导入功能必须具有其他好处.特别是,第1.6.6节(处理S4类)显示namespace了stats4包:

 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)
Run Code Online (Sandbox Code Playgroud)

这里导入的函数既不是S4类也不是泛型(使用import也是有意义的,如该部分中的示例所述),但是函数类似于R启动时自动加载plotgraphics包.

因此我的问题是,导入函数有什么好处plot,optim或者qchisq

Mar*_*gan 23

如果foo从包Bar导入函数,则无论用户对其搜索路径做什么,例如通过附加也具有功能的包Baz,都可以找到该功能foo.没有名称空间,包代码会突然发现自己使用Baz::foo.还存在效率问题(foo立即找到,而不是在搜索路径上的所有符号之后),但对于大多数应用程序而言,这些问题可能是微不足道的.以同样的方式,由于更少的冲突(或使用非预期的功能)和更有效的查找,这importFrom是一种改进import.

使用S4(和S3),事情会变得非常复杂.非泛型函数graphics::plot可以setGeneric在两个不同的包中提升为泛型(with ),每个泛型可以附加自己的一组方法.包作者需要准确了解哪些plot泛型,以及哪些方法调度表,它们的类和方法都可以看到.

调用函数pkg::foo始终解析为预期的函数.它要求pkg列在DESCRIPTION文件的Depends:字段中(可能在Imports中:但是它似乎误导了广告而不是从pkg导入),污染了用户的搜索路径.它还涉及两个符号查找和一个函数call(::),因此效率较低.对我来说,懒惰和缺乏注意力的细节部分也被::视为乏味且容易出错.

codetoolsBioC(通过带有用户名和密码的svn readonly)可以从现有的包中生成一个NAMESPACE文件(或者至少它可以在R-devel的最近更改之前在没有一个包的情况下在包上引入NAMESPACE;我还没有在这样的包上尝试过codetoolsBioC包).

  • 导入一个函数(从基础以外的包,它始终可用)总是有意义的,否则当第三个包定义一个函数`plot = function(...)时,我有一个很好的故事.告诉"你的代码坏了.您无法控制用户执行的搜索路径. (2认同)