使用save.image()保存R工作区时,如何保留tibble类型而非转为data.frame?
保留tibble类型存储R工作区的解决方案
方法一:加载前先启动tibble/tidyverse包
这是最省事的解决办法——问题根本不是存储时丢了类型,而是加载.Rdata的时候,环境里还没加载tibble包,导致R识别不出tibble的类属性,自动退化成了data.frame。
- 存储时正常执行:
save.image("~/r_all.Rdata", compress = TRUE) - 加载时先运行:
library(tidyverse)(或者单独library(tibble)),再执行load("~/r_all.Rdata"),tibble类型就能正常保留。
方法二:用qs包存储大文件(推荐)
你的数据总共有5GB,base R的save效率不算高,qs包专门针对大对象做了优化,压缩比更好,读写速度更快,还能完美保留所有对象类型:
- 先安装包:
install.packages("qs") - 存储整个工作区:
qs::qsavem(mget(ls()), file = "~/r_all.qs") - 加载时先启动
tibble/tidyverse,再运行:qs::qloadm("~/r_all.qs")
方法三:用arrow包处理(适合跨语言场景)
如果团队有跨语言使用数据的需求,arrow包的序列化格式也能完美保留tibble类型,同时压缩效率不错:
- 安装包:
install.packages("arrow") - 存储工作区:把所有对象放进列表再保存:
arrow::write_rds(mget(ls()), "~/r_all.arrow.rds", compression = "zstd") - 加载并导出到全局环境:
library(tidyverse) obj_list <- arrow::read_rds("~/r_all.arrow.rds") list2env(obj_list, .GlobalEnv)
方法四:手动指定对象存储(可选)
如果不想存整个工作区,只想保留特定对象,用save()函数指定对象列表,同样要保证加载前加载tibble包:
- 存储:
save(list = ls(), file = "~/r_all.Rdata", compress = TRUE)(ls()会列出当前所有对象,也可以换成你需要的对象名向量,比如c("tib1", "tib2", "func1")) - 加载:先
library(tibble),再load("~/r_all.Rdata")
内容的提问来源于stack exchange,提问作者taiyodayo
相关产品推荐
相关产品推荐

