r - 在保存()时重命名R对象

时间:2014-01-21 02:34:33

标签: r save

我正在寻找一种方法来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())。

感谢您的帮助!

4 个答案:

答案 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答案可能是有用的补充:

如果你想保存带有你之前定义为字符串的文件名的并加载文件,请考虑对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 ...中找到一种更简单的方法: