我正在寻找一种方法来save()
一个变量在一个不同的名字“在飞行中”在R中(跟我一起!我很确定这不是重复...)。这是我想要实现的一个例子:
AAA = 1
BBB = 2
XXX = 3
YYY = 4
save(AAA=XXX, BBB=YYY, file="tmp.Rdat")
# does NOT save a variable AAA to file with value 3 in it, which is the aim...
基本上我希望save()
函数取值XXX
并将其保存到名为AAA
的变量下的文件中。请注意,这不是关于重命名变量的问题:我当然可以在保存之前重命名变量XXX
,例如AAA = XXX
然后是save(AAA, ..., file=...)
,但这当然会在其余代码中弄乱AAA
的值。
显而易见的方法是创建临时变量,然后恢复值:
AAA = 1
BBB = 2
XXX = 3
YYY = 4
AAAtmp = AAA; BBBtmp = BBB # record values of AAA, BBB
AAA = XXX; BBB = YYY
save(AAA, BBB, file="tmp.Rdat")
AAA = AAAtmp; BBB = BBBtmp # restore values of AAA, BBB
...但是每个人都会认为这是非常混乱的(特别是有更多的变量)。
这一直困扰着我,我的感觉是函数save()
不能做我想要的。所以我想我必须更新我的代码并沿着使用其他保存功能的路径(例如saveRDS()
)。
感谢您的帮助!
答案 0 :(得分:9)
事实证明这比我预期的要复杂一些。我有兴趣看看其他人提出了什么,以及对我的解决方案有什么异议。
saveit <- function(..., file) {
x <- list(...)
save(list=names(x), file=file, envir=list2env(x))
}
foo <- 1
saveit(bar=foo, file="hi.Rdata")
答案 1 :(得分:0)
我发现我可以使用“get”函数创建一个列表并将环境中的所有对象分配给列表的每个元素,然后我可以重命名列表的每个元素。
另一种方法可能是将“assign”函数与“get”函数一起使用
objectNames <- ls(all.names=T)
res <- list()
for (o in objectNames) {
res[[paste(prefix,o,sep="_")]] <- get(o)
}
format(object.size(res), units="Gb")
答案 2 :(得分:0)
比定义作业的功能快一点,您可以创建local
环境:
local({
AAA <- XXX
BBB <- YYY
save(AAA, BBB, file="tmp.Rdat")
})
因为您正在工作并分配到不同的环境,所以您不需要存储在全局环境中仍然完好无损的临时变量:
> AAA
[1] 1
> BBB
[1] 2
答案 3 :(得分:0)
如果你想保存带有你之前定义为字符串的文件名的并加载文件,请考虑对Aarons的这个小修改(非常酷!)回答:
model_name <- "model1"
saveit <- function(..., string, file) {
x <- list(...)
names(x) <- string
save(list=names(x), file=file, envir=list2env(x))
}
fit <- somemodelingfunc(...)
saveit(fit = fit, string = model_name, file=paste(model_name, ".RData", sep=""))
这将添加功能,因为您可以将文件名作为字符串传递而不直接使用变量,如果您的存储和加载需要具有依赖于上下文的特定名称,这将非常有用。我的用例是模型拟合,例如我在文件开头只定义模型名称,但不需要修改脚本中的任何其他内容。我还没有在R ...中找到一种更简单的方法: