我正在开发一个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] 删除。
我来说两句