我最近提交给CRAN的提交被退回了,因为我已经对全球环境进行了分配,现在已经不满意了。
我有一个嵌入式数据集(sysdata.rda),其中包含基于用户所在州(如美国)的配置参数。我希望这个嵌入式数据集在新用户使用该程序时可以更新。我之前在用户使用的初始函数中更新了这些数据,并通过全局赋值使用户可以访问它。
我正在努力弄清楚如何更新此嵌入数据并使其成为用户在其余会话中使用的默认数据。
之前我将数据存放在/ data中,最近将其切换到/R/sysdata.rda,因为它似乎更适合该语言环境。现在我不太确定。
任何帮助非常感谢
答案 0 :(得分:4)
关键是在全局环境以外的环境中进行分配。有两种基本技术,使用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。
答案 1 :(得分:1)
为什么foo.R
中的/data
文件无法加载数据并在用户调用data(foo)
时对其进行更新?这是/data
允许的选项之一,但请注意Writing R Extensions
请注意,R代码应该“自给自足”并且不使用软件包提供的额外功能,这样也可以在不加载软件包的情况下使用数据文件。
如果你能接受这个限制,那么data(foo)
可以加载数据,更新它,并确保它在特定的命名对象中,然后在你的函数中引用它。