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

标签 r namespaces package

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 类也不是泛型(使用 import 也是有意义的,如 that section 中的示例中所述),但是像 plot 这样的函数来自R 启动时自动加载的 graphics 包。

因此我的问题是,导入plotoptimqchisq 等函数有什么好处?

最佳答案

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

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

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

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

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

相关文章:

r - 单击 Leaflet map 上的点以在 Shiny 中生成 ggplot

c# - 在您自己的类上使用 System.* 命名空间是否被视为不良做法?

python - python 中的 "Resolve Package Not Found"错误

python - 无法导入 python 模块

r - 将字符数组转换为数据框的简便方法

r - 在 R 中,克里金法给出 "system is exactly singular"错误

android - 使用不同的包名克隆应用程序

.net - 使用 MEF 按命名空间解析导入

java - 访问 protected 成员时出错

在R中 reshape csv文件