从表达式字符串保存 RData 和 RDS 文件对象

Posted

技术标签:

【中文标题】从表达式字符串保存 RData 和 RDS 文件对象【英文标题】:Saving RData and RDS File Object from an Expression String 【发布时间】:2021-02-23 04:35:29 【问题描述】:

我正在尝试使用表达式字符串动态保存 RData/RDS 文件,如下所示:

rdata_saver <- function(target="rdata-one", obj_name=c(), rdata_name=c(), directory="")
  if(target=="all")
    save.image(file=paste0(directory, rdata_name, ".RData")) 
  
  else if(target=="many")
    for(a in 1:length(obj_name))
      save(eval(parse(text=obj_name[a]), envir = environment()), file=paste0(directory, rdata_name[a], ".RData"))
    
  
  else if(target=="rdata-one")
    if(length(obj_name)==1)
      save(eval(parse(text=obj_name), envir = environment()), file=paste0(directory, rdata_name, ".RData"))
    
  
  else if(target=="rds-one")
    saveRDS(eval(parse(text=obj_name), envir = environment()), file=paste0(directory, rdata_name[a], ".rds"))
  

然后制作一些虚拟数据框:

a <- data.frame(x=seq(1,200,1), y=rnorm(200))
b <- data.frame(x=seq(1,500,1), y=rnorm(500))
c <- data.frame(x=seq(1,300,1), y=rnorm(300))

但似乎没有按预期工作,保存对象参数似乎将整个表达式视为对象名称,而不是“先评估它”

rdata_saver(target="rdata-one", obj_name="a", "test_data", "C:/Users/User/Downloads/")

 Error in save(eval(parse(text = obj_name)), file = paste0(directory, rdata_name,  : 
  object ‘eval(parse(text = obj_name))’ not found

这是否意味着无法从表达式中保存 RData?或者至少采用动态方法?

【问题讨论】:

【参考方案1】:

如果您将要保存的对象直接传递到函数中,这将起作用:

rdata_saver <- function(target="rdata-one",obj_name, rdata_name, directory = '')
      saveRDS(obj_name, paste0(directory, rdata_name, ".rds"))


rdata_saver("rdata-one", a, 'test', 'C:/Users/User/Downloads/')

如果您将它们作为字符串传递,我们可以使用get

rdata_saver <- function(target="rdata-one",obj_name, rdata_name, directory = '')
  saveRDS(get(obj_name), paste0(directory, rdata_name, ".rds"))


rdata_saver("rdata-one", 'a', 'test', 'C:/Users/User/Downloads/')

【讨论】:

以上是关于从表达式字符串保存 RData 和 RDS 文件对象的主要内容,如果未能解决你的问题,请参考以下文章

在单个 RDS 文件中保存多个变量

将多个变量保存在单个RDS文件中

r R写入rds和RData

将 .RData 保存在不同的目录中

加载 .RData 对象时出现问题:“文件‘pathway.path.RData’有幻数‘’不推荐使用 2 之前的保存版本”

使用for循环将数据帧保存为.Rdata文件[重复]