我正在处理作为包装一部分的功能。 该程序包包含一个新程序包的模板,以及一个为新程序包创建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)
这将在数据目录中产生两个文件:
包含test.rds
的文件letters
,但在加载程序包时不被R加载(不支持rds)
文件test.R
的代码为test <- readRDS("./test.rds")
,并导致在加载包时将test.rds
中的数据加载到变量{{1}中},其中包含test
。
现在CRAN不喜欢数据目录中的rds文件。
还有另一种方法可以使用标准格式(最好是letters
)来实现这一目标吗?
答案 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')
。尚未测试您以前的解决方案,它可能也可以正常工作。