0

I am trying to save RData/RDS File Dynamically with expression String, something that looks like this:

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

and then make some dummy Data Frame:

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

but it seems like it doesnt work expectedly, the save object parameter seems like to treat a whole expression as an object name rather than "evaluate it first"

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

Does this mean it isn't possible to save RData from expressions? or at least with dynamic approach?

Jovan
  • 763
  • 7
  • 26

1 Answers1

1

If you pass the object to be saved directly into the function this will work :

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/')

If you are passing them as string we can use 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/')
Ronak Shah
  • 377,200
  • 20
  • 156
  • 213