2016-09-29 78 views
0

我试图循环访问一个字符向量,并为每个值运行稍有不同的查询。然后我想要捕获结果,并将它们保存为rdata文件。一旦保存,我可以删除R对象。在循环中动态命名已保存的对象

我知道,我应该为应用/ sapply做这一点,并希望了解如何做到这一点小费...

不过,我的主要问题是,虽然RDATA文件保存很好用的名字我希望(即“TABLE1”,“TABLE2”),当我将它们加载回R中时,它们都具有“thisname”的对象名称,并具有与我希望的名称相对应的单个值“表格1”)。我一直试图做这个工作太久。

如果有人有建议,我会很感激!

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) 
     } 

回答

0

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

这不仅节省了对象的值,所以你读它由转让给任何名字你喜欢:

foo = readRDS("file.rds") 

或者,如果你已经保存了一堆东西.RData文件,将它们加载到新的环境,并获得价值,如:

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

把它换成一个整洁的函数。

+0

感谢您寻找。我无法使用saveRDS(),因为我的包要求通过data()加载数据,这限制了我的.RData和rda文件。 最后我在堆栈溢出中发现了一个解决方案,并将我的问题标记为重复。如果有人发现这篇文章,我会在下面发布我的最终解决方案。 – gruvn

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