R包中的功能分组

沃尔迪尔·莱昂西奥

语境

我正在开发一个R包,其中包含超过100页的函数,这些函数分为10个不同的主题。

期望的行为

我希望用户在调用函数时能够考虑这些主题。

例如,foo()用户不必调用,而是必须执行任一操作

load(theme1) # or whatever would be used to load a subgroup of functions
foo()

或类似的东西

theme1$foo()

我要阻止用户执行的操作是直接加载程序包并调用函数,而没有考虑主题,即library(package); foo()

我尝试过的

我已经使用modules软件包完成了先前一个软件包中的后一个解决方案,但是由于我的功能是如何相互依赖的,所以这次该软件包的发行版不能很好地工作(我已经就该主题打开了GitHub问题)。

我还考虑过编写自己的解决方案,也许是简单的事情,涉及到一个sublibrary()函数的创建,一次仅导出几个函数,但是我却一无所获。

当然,我认为发布10个不同的软件包在技术上也可以,但是我认为这是一个笨拙的解决方案。

除了使用模块之外,还有没有办法实现以上任一功能?

艾伦·卡梅伦

这是有关如何实现此sublibrary功能的想法在这种情况下,我们将使用它来加载ggplot2

sublibrary <- function(theme) {
  subgroups <- 
    list(basic   = list(ggplot = ggplot2::ggplot,
                        aes = ggplot2::aes,
                        geom_line = ggplot2::geom_line,
                        geom_point = ggplot2::geom_point),
        advanced = list(scale_color_manual = ggplot2::scale_color_manual,
                        theme = ggplot2::theme))
  
  attach(list2env(subgroups[[theme]]))
}

这意味着无需加载整个程序包就可以做到:

sublibrary("basic")

ggplot(iris, aes(Sepal.Length, Petal.Length, color = Species)) +
  geom_point()

实际上,subgroup对象将存储在函数外部,包名称空间内的列表或环境中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章