【发布时间】:2019-05-24 13:41:43
【问题描述】:
我正在开发一个作为包一部分的函数。 这个包包含一个新包的模板,以及一个为新包创建 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中的数据将加载到包含letters的变量test中。
现在 CRAN 不喜欢数据目录中的 rds 文件。
还有其他方法可以使用标准格式(最好是RData)来实现吗?
【问题讨论】:
-
我不确定我是否理解了这个问题,但也许像
eval(parse(text = sprintf("save(%s, file = %s)", varName, fileLocation)))这样的东西可以解决问题。然而,这需要将test导出为data,这也可以使用eval parse完成。看起来很老套,是的,所以应该存在更好的解决方案。 -
太棒了。我绝对应该研究这些
eval()和parse()。如果您将此放入答案中,我会接受。可能有一些关于parse()和eval()实际在这里做什么的信息? -
文件扩展名必须是
.rda,而不是导出。 -
你可能是对的,我只记得
.rda和实际变量名与文件名之间存在问题,但问题可能已经解决。不过,Eval parse 使用起来非常简单,但功能强大,如果您正在寻找代码中的动态性。正如你想象的那样,如果你在应用程序中使用它,主要问题是如果使用不小心,它会导致代码注入。 @alko989 解决方案似乎更干净 -
感谢您的解释。我会仔细看看@alko989 解决方案。