将对象保存为 for 循环的一部分,但将对象名称作为字符串传递到循环中

问题描述 投票:0回答:1

我整个周末都在享受闲暇时光,同时我的计算机在 R 中孜孜不倦地运行一系列 31 个贝叶斯模型(使用

brms
包)。我为每个模型对象分配了一个名称。当我今天早上回来时,我的工作区中有 31 个模型对象。电脑干得好!可悲的是,我在周五下午所做的“没有”做的是编写代码来“保存”每个模型对象。重新运行模型需要很长时间,并且需要相当多的代码来保存每个模型。所以我想知道是否可以通过 for 循环传递模型对象的名称来保存模型对象。下面包含简单的示例 # Two models mod1 <- lm(Sepal.Length ~ Species, data = iris) mod2 <- lm(Sepal.Width ~ Species, data = iris) 现在我想要为我的示例做的是通过

ls()
 将工作区中的对象名称作为名称列表获取,并存储为字符串。然而,为了这个简单示例的目的,我将手动将两个模型对象名称存储为列表

objNames <- c("mod1", "mod2")

现在 for 循环将对象名称作为字符串传递到 

save()
 函数中...

for(i in 1:length(objNames)) { save(objNames[i], file = paste0(objNames[i], ".RData")) }

 ....这显然不起作用,因为我对评估一无所知...并抛出错误...

Error in save(objNames[i], file = paste0(objNames[i], ".RData")) : 
  object ‘objNames[i]’ not found 

非常感谢任何帮助

	

您可以在此处使用

save.image
r lazy-evaluation evaluation
1个回答
0
投票

save.image(file = "Bayes_mods_31.RData")

或者仅指定与模式匹配的对象:

save(list=ls(pattern = "^mod\\d+"), file = "Bayes_mods_list.RData")

或者,如果您希望将各个模型放在单独的文件中,请使用

invisible(lapply(ls(), \(mod) save(list=mod, file = paste0(mod, ".RData"))))

然后使用

load
readRDS

将它们加载回 R:

rm(list=ls())
load("Bayes_mods_31.RData")
ls()
# [1] "mod1" "mod2"

rm(list=ls())
load("Bayes_mods_list.RData")
ls()
[1] "mod1" "mod2"

# Load one file
rm(list=ls())
load(file="mod1.RData") # Heed warning in help page
ls()
[1] "mod1"

# Load all "*.RData" fles in the specified directory
rm(list=ls())
invisible(lapply(list.files("F:/", pattern = "^mod\\d+"), load, .GlobalEnv))
ls()
[1] "mod1" "mod2"
    

© www.soinside.com 2019 - 2024. All rights reserved.