如何保存R中列表列中存储的对象

时间:2019-11-21 19:19:59

标签: r save purrr

如果我生成模型的列表列,并想将所有模型另存为.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")

2 个答案:

答案 0 :(得分:2)

该模型将以.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} )

答案 1 :(得分:1)

我们可以先assign先更改为对象标识符,然后再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可能会更好