在 R 中作为开发人员存储和更新包数据的最佳方式?

Best way to store and update package data as a dev in R?

我正在开发一个包,需要在 R 会话过程中在后台存储和操作数据。首先,这将是一个关于用户到目前为止下载了什么的数据框,当他们下载更多时更新等等。这个数据将用于我的包中的许多功能,例如,看看他们是否需要下载任何东西别的。我预计在某些情况下,此数据框可能会变得相对较大(数千行)。

我知道为包存储全局变量的一种简单方法是使用 option() 函数将它们存储为选项。我还可以想象在每个会话开始时调用一个有状态函数,它将作为此数据的网关。

但我总的感觉是选项的大小通常非常小,而且有状态函数看起来可能会让人感到困惑,需要一些工作才能顺利运行。 有没有更好的方法来存储这样的信息?如果有帮助,我不希望用户能够直接操作包数据。

您应该将数据帧存储在包的 /data 文件夹中。

here 所述,每个数据集应存储在一个 .RData 文件中,该文件仅包含一个对象,具有相同的名称,并由 save 命令创建。

作为导出函数,应该记录数据对象。一种可能性是在 /R 文件夹中创建一个 Roxygen .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"

[编辑]如果要在当前会话中存储包的数据,可以在包的 .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