在循环中动态命名保存的对象[重复]

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 文件。最后,我找到了关于 堆栈溢出的解决方案,并将我的问题标记为重复。如果有人发现这篇文章,我将在下面发布我的最终解决方案。【参考方案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

【讨论】:

以上是关于在循环中动态命名保存的对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Spring:beanfactory中循环依赖和命名重复

带冒号的动态 JavaScript 对象 [重复]

在while循环中动态回显字符串[重复]

在 R X 次中重复 for 循环并将每个值保存在向量中

如何在python中动态生成嵌套for循环[重复]

js如何去除数组中重复项