使用包函数中的动态变量名称创建 R 数据?

Create R data with a dynamic variable name from function for package?

我正在开发一个功能,它是包的一部分。 这个包包含一个新包的模板,以及一个为新包创建 R 数据的函数,这个新包必须有一个动态名称提供给这个函数。

目前我正在做以下事情:

makedata <- function(schemeName, data) {
  rdsFile <- paste0(schemeName, ".rds")
  varName <- paste0(schemeName)
  saveRDS(
    data,
    file = file.path( ".", "data", rdsFile )
  )
  cat(
    paste0(varName, " <- readRDS(\"./", rdsFile, "\")"),
    file = file.path( ".", "data", paste0(varName, ".R") )
  )
}

makedata(name = "test", data = letters)

这导致数据目录中有两个文件:

  1. 一个文件test.rds包含letters但是在加载包时它没有被R加载(不支持rds)

  2. 一个文件test.R,其代码为test <- readRDS("./test.rds"),当加载包时,test.rds中的数据会加载到变量中test 其中包含 letters.

现在CRAN不喜欢data目录下的rds文件

还有其他方法可以使用标准格式(最好是 RData)来实现吗?

您可以尝试这样的操作:

makedata <- function(schemeName, data) {
  rdataFile <- paste0(schemeName, ".rda")
  ## Assign data to the name saved in schemeName
  assign(x = schemeName, value = data)
  ## Save as RData file
  save(list = schemeName, file = file.path( ".", "data", rdataFile))
}

eval parse 的可能替代方案,如评论中所述。

makedata <- function(schemeName, data) {
  rdaFile <- paste0(schemeName, ".rda")
  fileLocation <- file.path( ".", "data", rdaFile )
  varName <- paste0(schemeName)

  assign(varName, data)
  eval(parse(text = sprintf("save(%s, file = '%s')", varName, fileLocation)))

  cat(sprintf("%s <- load(%s, file = '%s')", 
              varName, varName,
              fileLocation
              ),
      file = file.path( ".", "data", paste0(varName, ".R") ))
}

题外话: 此外,由于您正在开发软件包,一个方便的选项可能是使用 system.file 而不是 file.path,因为选项 system.file('data/test.R', package = 'yourPackage') 允许在您的软件包目录中查找,无论它安装在何处。尚未测试您以前的解决方案,它可能也能正常工作。