如何在加载后将函数附加到我的包的命名空间?

时间:2015-04-25 02:49:59

标签: r r-package

这可能看起来像一个奇怪的问题,但我确实有一个用例,我想弄清楚。

假设我正在编写一个包,并且我有一个函数,我希望允许用户别名为其他东西 - 用户提供函数的名称。我想知道实现这个目标的最佳途径是什么?

#' @export
foo <- function() "Hello"
#' @export
addAlias <- function(x) assign(x, foo, envir = globalenv())

这是我想要的行为 - 现在用户可以调用addAlias("bar"),然后如果他调用bar(),就好像他调用了我的函数一样。

显然这不是一个好的解决方案,因为它分配给全球环境。有没有人对什么是最好的方法有反馈?我尝试了几种方法:

1。分配到globalenv

就像我在示例中所示。这似乎有效。

2。分配到包的环境

addAlias <- function(x) assign(x, foo, as.environment("package:mypackage"))

直到我意识到它只能与devtools一起使用,而不是因为锁定环境而正确加载包

第3。将新环境附加到搜索路径

.onLoad <- function(libname, pkgname) {
  assign("aliases", new.env(), envir = parent.env(environment()))
  attach(aliases)
  invisible()
}

addAlias <- function(x) assign(x, foo, aliases)

由于attach的使用,我不喜欢这个。在这种情况下是否有必要?我什么时候会detach

4。公开一个单独的命名环境

#' @export
#' @keywords internal
aliases <- new.env()

addAlias <- function(x) assign(x, foo, aliases)

这样做有效,但用户无需拨打bar(),而是需要致电alises$bar()mypackage::aliases$bar()。我不喜欢这样,但这是一个有趣的实验。我也不知道是否可以导出这样的变量?

感谢任何帮助

1 个答案:

答案 0 :(得分:1)

我认为更合适的方法是使用closure

WHERE (order_id=0 OR plan=9 and id = '".$q."')

有了这个,你可以做到

#' @export
foo <- function() "Hello"
#' @export
getfoo <- function() {
    function(){
        # do anything, including running foo()
        foo()
    }
}