【问题标题】:how to save objects stored in a list column in R如何保存存储在R中的列表列中的对象
【发布时间】:2020-03-17 19:40:56
【问题描述】:

如果我生成一个模型列表列并希望将所有模型保存为 .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")

【问题讨论】:

  • 可以指定list =

标签: r save purrr


【解决方案1】:

模型被加载为.x,除非all.names=TRUE提供,否则ls()不会显示该模型:

# 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} )

【讨论】:

    【解决方案2】:

    我们可以通过assigning 对对象标识符然后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 可能会更好

    【讨论】:

    • 我不清楚如何在walk() 中申请list = 。我尝试将list = 添加到walk() 不起作用。 walk2( .x = mt_models$models, .y = mt_models$file_name, .f = ~save(list = .x, file = .y) )
    • @Joe 我更新了帖子。抱歉,我之前很忙
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多