我正在开发一个包,需要在R会话过程中在后台存储和处理数据。首先,这将是一个关于用户到目前为止下载了什么的数据框架,随着用户下载更多的数据而更新,等等。 这些数据将被用于我的包中的许多函数,例如,看看他们是否需要下载其他东西。 我希望在某些情况下,这个数据框架可能会变得比较大(数千行)。
我知道,为包存储全局变量的一个简单方法是将它们作为选项,用 option()
函数。 我也可以想象在每个会话开始时调用一个有状态函数,作为这些数据的网关。
但我普遍感觉到,选项的规模一般都是要很小的,有状态函数似乎可能会让人感到困惑,需要一些工作才能顺利操作。有没有更好的方法来存储这样的信息? 如果有帮助的话,我不希望用户能够直接操作包的数据。
你应该将数据帧存储在 /data
包的文件夹。
如上所述 此处每一个数据集都应该存储在一个叫作 "数据集 "的地方。.RData
文件,只包含一个对象,名称相同,由 save
命令。
作为导出的函数,数据对象应该被记录下来。一种可能的做法是,在 /R
文件夹中的 @format
标签来描述数据集的内容,并在脚本结束时使用 "DataSetName"
#' My data set
#'
#' some useful data
#'
#' @format a dataframe with 464 rows and 2 variables
#' * bar : bar name
#' * foo : foo value
#'
#' @source created by me
"DataSetName"
[编辑]如果你想在当前Session中为包存储数据,你可以在包的一个.R脚本中为包创建一个隐藏环境。
.pkg.env <- new.env()
#' Set hidden variable
#'
#' @param var
#'
#'
pkg.set <- function(var) {
varname <- deparse(substitute(var))
if (exists(varname,env=parent.frame())) {
assign(deparse(substitute(var)),var,env=.pkg.env)}
else {
stop(paste(varname,"doesn't exist"))
}
}
#' get hidden variable
#'
#' @param var
#'
#'
pkg.get <- function(var) {
varname <- deparse(substitute(var))
.pkg.env[[varname]]
}
这两个函数都没有被导出,所以用户看不到它们。不过,你可以在你的包的函数之间使用它们。
TempData <- data.frame(test="Test")
pkg.set(TempData)
pkg.get(TempData)
test
1 Test