【问题标题】:Dynamically naming saved objects in a loop [duplicate]在循环中动态命名保存的对象[重复]
【发布时间】:2016-09-29 19:09:47
【问题描述】:

我正在尝试遍历一个字符向量,并为每个值运行一个略有不同的查询。然后我想捕获结果,并将它们作为 rdata 文件在本地保存。保存后,我可以删除 R 对象。

我知道我应该以申请/申请的方式执行此操作,并希望获得有关如何执行此操作的提示...

但是,我的主要问题是,虽然 rdata 文件以我希望的名称(即“TABLE1”、“TABLE2”)很好地保存,但当我将它们加载回 R 时,它们的对象名称均为“thisname”,具有与我希望的名称相对应的单个值(例如“TABLE1”)。我一直试图使这项工作太久了。

如果有人有建议,我将不胜感激!

tables = c('TABLE1','TABLE2')
for (i in 1:length(tables)){
       thisname=paste0(tables[i])
       data= sqlQuery(oracle.channel, paste("select * from",table_renamer(tables[i]),"WHERE ROWNUM<10;"))
       assign(thisname,data)
       save(thisname, file=file.path(paste0( tables[i],".RData")))
        rm(thisname)
        rm(thisdf)
      }

【问题讨论】:

    标签: r loops apply


    【解决方案1】:

    使用saveRDS(thing, file="file.rds")

    这只会保存对象的值,因此您可以通过分配给您喜欢的任何名称来读取它:

    foo = readRDS("file.rds")
    

    或者,如果您已经将一堆内容保存到 .RData 文件中,请将它们加载到新环境中并获取值,例如:

    e = new.env()
    load("foo.RData", environment=e)
    foo = e$thisname
    

    将其包装成一个简洁的函数。

    【讨论】:

    • 感谢收看。我无法使用 saveRDS(),因为我的包要求通过 data() 加载数据,这将我限制为 .RData 和 rda 文件。最后,我找到了关于 堆栈溢出的解决方案,并将我的问题标记为重复。如果有人发现这篇文章,我将在下面发布我的最终解决方案。
    【解决方案2】:

    我的最终解决方案确实使用了 sapply,这很好:

     #make a custom function to do the data handling, including saving
     saveit <- function(x, oracle.channel, data.dir){
          assign(x,sqlQuery(oracle.channel, paste("select * from",table_renamer(x),"WHERE ROWNUM<10;")))
          save(list=x, file=file.path(data.dir, paste0( x,".RData")))
    }
    #sapply to make it happen
    sapply(tables, simplify=TRUE, saveit, oracle.channel, data.dir)
    

    真正的诀窍是保存列表:save(list=x, ...),我学到了here

    【讨论】:

      猜你喜欢
      • 2021-02-06
      • 1970-01-01
      • 1970-01-01
      • 2020-06-27
      • 1970-01-01
      • 1970-01-01
      • 2021-02-06
      • 2017-01-23
      • 1970-01-01
      相关资源
      最近更新 更多