【发布时间】:2015-04-25 02:49:58
【问题描述】:
这似乎是一个奇怪的问题,但我确实有一个我正在尝试弄清楚的用例。
假设我正在编写一个包,并且我有一个函数,我想允许用户使用其他名称 - 用户提供函数的名称。我想知道实现这一目标的最佳方法是什么?
#' @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()。我不喜欢那样,但这是一个有趣的实验。也不知道这样导出变量行不行?
感谢任何帮助
【问题讨论】: