通过封装函数使用动态变量名创建R数据?

时间:2019-05-24 13:41:43

标签: r r-package rdata

我正在处理作为包装一部分的功能。 该程序包包含一个新程序包的模板,以及一个为新程序包创建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中的数据加载到变量{{1}中},其中包含test

现在CRAN不喜欢数据目录中的rds文件。

还有另一种方法可以使用标准格式(最好是letters)来实现这一目标吗?

2 个答案:

答案 0 :(得分:1)

您可以尝试以下操作:

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))
}

答案 1 :(得分:1)

使用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')。尚未测试您以前的解决方案,它可能也可以正常工作。