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

问题描述

我正在尝试使用表达式字符串动态保存 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),".RData"))
    }
  }
  else if(target=="rds-one"){
    saveRDS(eval(parse(text=obj_name),".rds"))
  }
}

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

a <- data.frame(x=seq(1,200,1),y=rnorm(200))
b <- data.frame(x=seq(1,500,y=rnorm(500))
c <- data.frame(x=seq(1,300,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,: 
  object ‘eval(parse(text = obj_name))’ not found

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

解决方法

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

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

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

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

rdata_saver <- function(target="rdata-one",directory = ''){
  saveRDS(get(obj_name),'a','C:/Users/User/Downloads/')

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...