动态命名循环中保存的对象

时间:2016-09-29 19:09:47

标签: r loops apply

我正在尝试循环遍历字符向量,并且对于每个值,运行稍微不同的查询。然后我想捕获结果,并将它们作为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)
      }

2 个答案:

答案 0 :(得分:0)

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

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

foo = readRDS("file.rds")

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

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

将其包裹成一个整洁的功能。

答案 1 :(得分:0)

我的最终解决方案确实使用了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