Skip to content

save an object by dynamicly created name

9 messages · jeffc, Henrik Bengtsson, David Winsemius +2 more

#
Hi,

I would like to save a few dynamically created objects to disk. The
following is the basic flow of the code segment

for(i = 1:10) {
   m = i:5
   save(m, file = ...) ## ???
}
To distinguish different objects to be saved, I would like to save m as m1,
m2, m3 ..., to file /home/data/m1, /home/data/m2, home/data/m3, ...

I tried a couple of methods on translating between object names and strings
(below) but couldn't get it to work. 
https://stat.ethz.ch/pipermail/r-help/2008-November/178965.html
http://tolstoy.newcastle.edu.au/R/help/04/08/2673.html

Any suggestions would be appreciated.

thanks

Hao
#
path <- "data";
dir.create(path);

for (i in 1:10) {
  m <- i:5;
  filename <- sprintf("m%02d.Rbin", i);
  pathname <- file.path(path, filename);
  save(m, file=pathname);
}

/H
On Sun, Nov 1, 2009 at 6:53 PM, jeffc <hcen at andrew.cmu.edu> wrote:
#
On Nov 1, 2009, at 10:16 PM, Henrik Bengtsson wrote:

            
That would result in each of the ten files containing an object with  
the same  name == "m". (Also on my system R data files have type  
Rdta.) So I thought what was requested might have been a slight mod:

path <- "~/";
dir.create(path);

for (i in 1:10) {
  assign( paste("m", i, sep=""),  i:5)
  filename <- sprintf("m%02d.Rdta", i)
  pathname <- file.path(path, filename)
  obj =get(paste("m", i, sep=""))
  save(obj, file=pathname)
}
#
On Sun, Nov 1, 2009 at 7:48 PM, David Winsemius <dwinsemius at comcast.net> wrote:
Then a more convenient solution is to use saveObject() and
loadObject() of R.utils.  saveObject() does not save the name of the
object save.  If you want to save multiple objects, the wrap them up
in a list.  loadObject() does not assign variable, but instead return
them. Example:

library("R.utils");
x <- list(a=1,b=LETTERS,c=Sys.time());
saveObject(x, file="foo.Rbin");
y <- loadObject("foo.Rbin");
stopifnot(identical(x,y));

So, for the original example, I'd recommend:

library("R.utils");
path <- "data";
mkdirs(path);

for (i in 1:10) {
  m <- i:5;
  filename <- sprintf("m%02d.Rbin", i);
  saveObject(m, file=filename, path=path);
}

and loading the objects back as:

for (i in 1:10) {
  filename <- sprintf("m%02d.Rbin", i);
  m <- loadObject(filename, path=path);
  print(m);
}

/Henrik
#
On Nov 1, 2009, at 11:28 PM, Henrik Bengtsson wrote:

            
The OP asked for this outcome :

" I would like to save m as m1, m2, m3 ...,
to file /home/data/m1, /home/data/m2, home/data/m3, ..."
I agree that a list would makes sense if it were to be stored in one  
file , although it was not what requested. But wouldn't that require  
assign()-ing a name before list()-wrapping?

I suppose we ought to mention that the use of assign to create a  
variable is a FAQ ... 7.21? Yep, I have now referred to it a  
sufficient number of times to refer to it by number.

http://cran.r-project.org/doc/FAQ/R-FAQ.html#How-can-I-turn-a-string-into-a-variable_003f
#
On Sun, Nov 1, 2009 at 9:18 PM, David Winsemius <dwinsemius at comcast.net> wrote:
That comment was not for the OP, but for saveObject()/loadObject() in general.
Nope, the whole point of using saveObject()/loadObject() is to save
the objects/values without their names that you happens to choose in
the current session, and to avoid overwriting existing ones in your
next session. My example could also have been:

library("R.utils");
saveObject(list(a=1,b=LETTERS,c=Sys.time()), file="foo.Rbin");
y <- loadObject("foo.Rbin");
z <- loadObject("foo.Rbin");
stopifnot(identical(y,z));

If you really want to attach the elements of the saved list, do:

attachLocally(loadObject("foo.Rbin"));
num 1
chr [1:26] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" ...
POSIXct[1:1], format: "2009-11-01 21:30:41"
My personal take on assign() and get() is that if you find yourself
using them (at this level), there is a good chance there exists a
better solution that you should use instead.

My $.02

/H
#
jeffc wrote:
save(m, file = paste("/home/data/m", i, ".rdata", sep="")

Dieter
#
Hi Henrik and David,

Thank you very much for your suggestions. I found both meet my needs.

In the following code,  I found save(obj,file=pathname) would save the
content into an object called obj. 

path <- "~/";
dir.create(path);

for (i in 1:10) {
  assign( paste("m", i, sep=""),  i:5)
  filename <- sprintf("m%02d.Rdta", i)
  pathname <- file.path(path, filename)
  obj =get(paste("m", i, sep=""))
  save(obj, file=pathname)
}

A tweak to this would be

path <- "~/";
dir.create(path);

for (i in 1:10) {
  assign( paste("m", i, sep=""),  i:5)
  filename <- sprintf("m%02d.Rdta", i)
  pathname <- file.path(path, filename)
  save(list = paste("m", i, sep=""), file=pathname)
}


Thanks a lot

Hao

-----Original Message-----
From: henrik.bengtsson at gmail.com [mailto:henrik.bengtsson at gmail.com] On
Behalf Of Henrik Bengtsson
Sent: Monday, November 02, 2009 12:34 AM
To: David Winsemius
Cc: r-help at r-project.org; jeffc
Subject: Re: [R] save an object by dynamicly created name

On Sun, Nov 1, 2009 at 9:18 PM, David Winsemius <dwinsemius at comcast.net>
wrote:
,
That comment was not for the OP, but for saveObject()/loadObject() in
general.
Nope, the whole point of using saveObject()/loadObject() is to save
the objects/values without their names that you happens to choose in
the current session, and to avoid overwriting existing ones in your
next session. My example could also have been:

library("R.utils");
saveObject(list(a=1,b=LETTERS,c=Sys.time()), file="foo.Rbin");
y <- loadObject("foo.Rbin");
z <- loadObject("foo.Rbin");
stopifnot(identical(y,z));

If you really want to attach the elements of the saved list, do:

attachLocally(loadObject("foo.Rbin"));
num 1
chr [1:26] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" ...
POSIXct[1:1], format: "2009-11-01 21:30:41"
is
times
http://cran.r-project.org/doc/FAQ/R-FAQ.html#How-can-I-turn-a-string-into-a-
variable_003f

My personal take on assign() and get() is that if you find yourself
using them (at this level), there is a good chance there exists a
better solution that you should use instead.

My $.02

/H
as
http://old.nabble.com/save-an-object-by-dynamicly-created-name-tp26155437p26
155437.html
5 days later
#
Hi Henrik,

I am using your saveObject/loadObject to handle over 1000 matrices. It
worked beautifully. Because I need to load those matrices often for
evaluating a few functions on them and those matrices do not fit all in
memory at once, is there a way to speed up the loading part? I tried save
all the binary files to /dev/shm  (shared memory section in linux) but the
speed of loadObject on /dev/shm remains the same as on the disk.

Thanks

Hao



-----Original Message-----
From: henrik.bengtsson at gmail.com [mailto:henrik.bengtsson at gmail.com] On
Behalf Of Henrik Bengtsson
Sent: Monday, November 02, 2009 12:34 AM
To: David Winsemius
Cc: r-help at r-project.org; jeffc
Subject: Re: [R] save an object by dynamicly created name

On Sun, Nov 1, 2009 at 9:18 PM, David Winsemius <dwinsemius at comcast.net>
wrote:
,
That comment was not for the OP, but for saveObject()/loadObject() in
general.
Nope, the whole point of using saveObject()/loadObject() is to save
the objects/values without their names that you happens to choose in
the current session, and to avoid overwriting existing ones in your
next session. My example could also have been:

library("R.utils");
saveObject(list(a=1,b=LETTERS,c=Sys.time()), file="foo.Rbin");
y <- loadObject("foo.Rbin");
z <- loadObject("foo.Rbin");
stopifnot(identical(y,z));

If you really want to attach the elements of the saved list, do:

attachLocally(loadObject("foo.Rbin"));
num 1
chr [1:26] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" ...
POSIXct[1:1], format: "2009-11-01 21:30:41"
is
times
http://cran.r-project.org/doc/FAQ/R-FAQ.html#How-can-I-turn-a-string-into-a-
variable_003f

My personal take on assign() and get() is that if you find yourself
using them (at this level), there is a good chance there exists a
better solution that you should use instead.

My $.02

/H
as
http://old.nabble.com/save-an-object-by-dynamicly-created-name-tp26155437p26
155437.html