我最近提交给CRAN的文件被退回了,因为我有分配给全局环境的任务,这是现在不赞成的。
我有一个嵌入式数据集(sysdata.rda),其中包含基于用户所在州(如美国)的配置参数。我希望这个嵌入的数据集是可更新的,当一个新用户使用该程序。我之前在用户使用的初始函数中更新了该数据,并使用户可以通过全局赋值访问它。
我正在努力弄清楚如何更新这个嵌入的数据,并使其成为用户在会话的其余部分使用的默认数据。
以前我将数据放在/data中,最近将其切换到/R/sysdata。Rda,因为它看起来更适合那个地区。现在我不那么确定了。
任何帮助都非常感谢
关键是要在全局环境以外的环境中执行赋值。有两种基本技术,使用local()
和<<-
或显式创建新环境:
使用显式环境很简单:创建环境,然后像列表一样赋值给它:
my_opts <- new.env(parent = emptyenv())
set_state <- function(value) my_opts$state <- value
get_state <- function() my_opts$state
使用local()
稍微复杂一些,并且需要使用<<-
的一些技巧
set_state <- NULL
get_state <- NULL
local({
state <- NULL
get_state <<- function() state
set_state <<- function(value) state <<- value
})
有关<<-
工作原理的更多信息,请参阅https://github.com/hadley/devtools/wiki/environments,在"赋值:将名称绑定到值"一节。
为什么不在/data
中有一个foo.R
文件,当用户调用data(foo)
时加载数据并更新它?这是/data
允许的选项之一,但请注意写R扩展
注意R代码应该是"自给自足的",而不是使用包提供的额外功能,这样数据文件也可以在不加载包的情况下使用。
如果你能接受这个限制,那么data(foo)
可以加载数据,更新它,并确保它在一个特定的命名对象中,然后你在你的函数中引用它。