如何保存存储在 R 列表列中的对象
how to save objects stored in a list column in R
如果我生成一个模型列表列并想将所有模型保存为 .rda 文件,我 运行 会遇到一些麻烦。
library(dplyr)
library(tidyr)
library(purrr)
mt_models <-
mtcars %>%
group_by(cyl) %>%
nest() %>%
mutate(
models = map(.x = data, .f = ~lm(mpg ~ wt, data = .x)),
file_name = paste("model", cyl, "cyl.rda", sep = "_")
)
# mt_models$models currently have no names
names(mt_models$models)
# so I've assigned names to the models so that save() will be handling named objects.
names(mt_models$models) <- paste("model", mt_models$cyl, "cyl", sep = "_")
walk2(
.x = mt_models$models,
.y = mt_models$file_name,
.f = ~save(.x, file = .y)
)
虽然我可以在我的目录中看到保存的对象,但我不能 load
将保存的对象放入我的环境中。
当我尝试加载时,该函数似乎 运行 成功,但没有任何反应,甚至没有错误,也没有任何对象添加到我的环境中。
load("model_6_cyl.rda")
相比之下,如果我保存一个模型,它在我的环境中很容易查看并且很容易加载。
mt_model <- lm(mpg ~ wt, data = mtcars)
save(mt_model, file = "temp.rda")
load("temp.rda")
我们可以通过 assign
ing 对象标识符然后 save
进行一些更改
library(purrr)
library(dplyr)
library(stringr)
walk2(
mt_models$models,
mt_models$file_name,
~ {nm1 <- str_remove(.y, "\.rda")
assign(nm1, .x)
save(list = nm1, file = .y )
}
)
在新的 R 会话中
ls()
#character(0)
load("model_6_cyl.rda")
ls()
#[1] "model_6_cyl"
saveRDS
不过
可能更好
模型加载为 .x
,ls()
不显示,除非提供 all.names=TRUE
:
# In a fresh R session
load("model_6_cyl.rda")
ls( all.names=TRUE )
# [1] ".x"
您可以通过将加载封装在由 {}
定义的新环境中,然后从该环境返回 .x
,从而一次性加载所有模型:
mdls <- purrr::map( list.files(pattern="rda"), ~{load(.); .x} )
如果我生成一个模型列表列并想将所有模型保存为 .rda 文件,我 运行 会遇到一些麻烦。
library(dplyr)
library(tidyr)
library(purrr)
mt_models <-
mtcars %>%
group_by(cyl) %>%
nest() %>%
mutate(
models = map(.x = data, .f = ~lm(mpg ~ wt, data = .x)),
file_name = paste("model", cyl, "cyl.rda", sep = "_")
)
# mt_models$models currently have no names
names(mt_models$models)
# so I've assigned names to the models so that save() will be handling named objects.
names(mt_models$models) <- paste("model", mt_models$cyl, "cyl", sep = "_")
walk2(
.x = mt_models$models,
.y = mt_models$file_name,
.f = ~save(.x, file = .y)
)
虽然我可以在我的目录中看到保存的对象,但我不能 load
将保存的对象放入我的环境中。
当我尝试加载时,该函数似乎 运行 成功,但没有任何反应,甚至没有错误,也没有任何对象添加到我的环境中。
load("model_6_cyl.rda")
相比之下,如果我保存一个模型,它在我的环境中很容易查看并且很容易加载。
mt_model <- lm(mpg ~ wt, data = mtcars)
save(mt_model, file = "temp.rda")
load("temp.rda")
我们可以通过 assign
ing 对象标识符然后 save
library(purrr)
library(dplyr)
library(stringr)
walk2(
mt_models$models,
mt_models$file_name,
~ {nm1 <- str_remove(.y, "\.rda")
assign(nm1, .x)
save(list = nm1, file = .y )
}
)
在新的 R 会话中
ls()
#character(0)
load("model_6_cyl.rda")
ls()
#[1] "model_6_cyl"
saveRDS
不过
模型加载为 .x
,ls()
不显示,除非提供 all.names=TRUE
:
# In a fresh R session
load("model_6_cyl.rda")
ls( all.names=TRUE )
# [1] ".x"
您可以通过将加载封装在由 {}
定义的新环境中,然后从该环境返回 .x
,从而一次性加载所有模型:
mdls <- purrr::map( list.files(pattern="rda"), ~{load(.); .x} )