gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 13:53:48 25 4
gpt4 key购买 nike

R 的命名空间机制允许导出函数,然后这些函数对用户可见。此外,它还允许从其他包导入函数。虽然导出的好处是显而易见的,但我在理解进口的好处时遇到了更多问题。

一个好处似乎是,可以使用其他包中的函数而无需附加包,从而节省内存。 1.6.4 in the writing R extensions manual 部分对此进行了举例说明。 .

但是,导入功能肯定还有其他好处。特别是,section 1.6.6 (that deals with S4 classes)显示 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)

这里导入的函数既不是 S4 类也不是泛型(在这些函数中使用导入也是有意义的,如 that section 中的示例中所述),但是像 plot 这样的函数R 启动时自动加载的 graphics 包。

因此我的问题是,导入诸如 plotoptimqchisq 之类的函数有什么好处?

最佳答案

如果函数 foo 是从 Bar 包中导入的,那么无论用户对其搜索路径执行什么操作,例如,通过附加也具有函数 foo 的包 Baz,都会找到该函数。如果没有 namespace ,包代码会突然发现自己使用 Baz::foo。还有效率问题(foo 是立即找到的,而不是在搜索路径上的所有符号之后找到),但这些对于大多数应用程序来说可能是微不足道的。同样,importFrom 是对 import 的改进,因为它更少的冲突(或使用非预期函数)和更高效的查找。

对于 S4(和 S3),事情可能会变得非常复杂。像 graphics::plot 这样的非泛型函数可以在两个不同的包中提升为泛型函数(使用 setGeneric),并且每个泛型函数都可以附加自己的一组方法。包作者希望精确了解哪个 plot 通用,以及哪些方法调度表、它们的类和方法。

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

包裹codetoolsBioC (通过 svn 使用用户名和密码 readonly)可以从现有包生成 NAMESPACE 文件(或者至少在最近对 R-devel 的更改在没有 NAMESPACE 的包上引入 NAMESPACE 之前可以);我还没有在这样的包上尝试过 codetoolsBioC)。

关于r - 在 R 中的命名空间中导入有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7283134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com