在循环中动态命名保存的对象[重复]
Posted
技术标签:
【中文标题】在循环中动态命名保存的对象[重复]【英文标题】: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)
【问题讨论】:
【参考方案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 文件。最后,我找到了关于我的最终解决方案确实使用了 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
【讨论】:
以上是关于在循环中动态命名保存的对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章