这可能看起来像一个奇怪的问题,但我确实有一个用例,我想弄清楚。
假设我正在编写一个包,并且我有一个函数,我希望允许用户别名为其他东西 - 用户提供函数的名称。我想知道实现这个目标的最佳途径是什么?
#' @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()
。我不喜欢这样,但这是一个有趣的实验。我也不知道是否可以导出这样的变量?
感谢任何帮助
答案 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()
}
}