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

问题描述 投票:0回答:1

我正在开发一个包,需要在R会话过程中在后台存储和处理数据。首先,这将是一个关于用户到目前为止下载了什么的数据框架,随着用户下载更多的数据而更新,等等。 这些数据将被用于我的包中的许多函数,例如,看看他们是否需要下载其他东西。 我希望在某些情况下,这个数据框架可能会变得比较大(数千行)。

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

但我普遍感觉到,选项的规模一般都是要很小的,有状态函数似乎可能会让人感到困惑,需要一些工作才能顺利操作。有没有更好的方法来存储这样的信息? 如果有帮助的话,我不希望用户能够直接操作包的数据。

r package r-package
1个回答
1
投票

你应该将数据帧存储在 /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
© www.soinside.com 2019 - 2024. All rights reserved.