【问题标题】:r - Rename R object while save()-ing itr - 在保存()时重命名 R 对象
【发布时间】:2014-02-10 10:52:19
【问题描述】:

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

感谢您的帮助!

【问题讨论】:

  • 你能解释一下你为什么要这样做吗?看起来 saveRDS 可能更适合你想要的......
  • @Dason:没有主要原因,就像我编写代码的方式一样:我有时需要将给定变量保存在工作区中已经存在的名称下(例如,保存一个 tmp 变量并将其设为“看起来”就像它是非 tmp 的一样)。它在过去出现了几次,每次我都试图解决这个问题,但都没有成功。所以这次我决定请教专家... :)

标签: r save


【解决方案1】:

事实证明,这比我预期的要复杂一些。我很想看看其他人想出什么,以及对我的解决方案有什么反对意见。

saveit <- function(..., file) {
  x <- list(...)
  save(list=names(x), file=file, envir=list2env(x))
}

foo <- 1
saveit(bar=foo, file="hi.Rdata")

【讨论】:

  • 是的,这似乎可以按预期完美运行。最重要的是,它允许在“另一端”使用load(),这意味着我不必更新所有实际使用已保存数据的代码(就像@987654323 的情况一样@/readRDS() 例如)。我仍然需要为这个解决方案定义一个新函数saveit()......恕我直言,将它内置到save()函数本身会很好(根据我原始帖子中的测试)。
【解决方案2】:

比为作业定义函数要快一点,你可以创建一个local 环境:

local({
    AAA <- XXX
    BBB <- YYY
    save(AAA, BBB, file="tmp.Rdat")  
})

因为您正在工作并分配给不同的环境,所以您不需要存储在全局环境中仍然完好无损的临时变量:

> AAA
[1] 1
> BBB
[1] 2

【讨论】:

    【解决方案3】:

    可能对 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 中看到更简单的方法...

    【讨论】:

      【解决方案4】:

      我发现我可以创建一个列表并使用“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")
      

      【讨论】:

        猜你喜欢
        • 2011-02-12
        • 1970-01-01
        • 2019-08-13
        • 1970-01-01
        • 2020-07-05
        • 2014-10-05
        • 2021-10-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多