[R] save an object by dynamicly created name

Hao Cen hcen at andrew.cmu.edu
Sun Nov 8 15:26:28 CET 2009


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:
>
> On Nov 1, 2009, at 11:28 PM, Henrik Bengtsson wrote:
>
>> On Sun, Nov 1, 2009 at 7:48 PM, David Winsemius <dwinsemius at comcast.net>
>> wrote:
>>>
>>> On Nov 1, 2009, at 10:16 PM, Henrik Bengtsson wrote:
>>>
>>>> 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);
>>>> }
>>>>
>>>
>>> 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)
>>> }
>>
>> Then a more convenient solution is to use saveObject() and
>> loadObject() of R.utils.  saveObject() does not save the name of the
>> object save.
>
> 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, ..."
>
>
>>  If you want to save multiple objects, the wrap them up
>> in a list.
>
> I agree that a list would makes sense if it were to be stored in one file
,
> although it was not what requested.

That comment was not for the OP, but for saveObject()/loadObject() in
general.

> But wouldn't that require assign()-ing a name before list()-wrapping?

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"));
> str(a)
 num 1
> str(b)
 chr [1:26] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" ...
> str(c)
 POSIXct[1:1], format: "2009-11-01 21:30:41"

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

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

>
> --
> David
>
>>  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
>>
>>>
>>> --
>>> David.
>>>
>>>> /H
>>>>
>>>> On Sun, Nov 1, 2009 at 6:53 PM, jeffc <hcen at andrew.cmu.edu> wrote:
>>>>>
>>>>> 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
>>>>>
>>>>> --
>>>>> View this message in context:
>>>>>
>>>>>
http://old.nabble.com/save-an-object-by-dynamicly-created-name-tp26155437p26
155437.html
>>>>> Sent from the R help mailing list archive at Nabble.com.
>>>>>
>>>>> ______________________________________________
>>>>> R-help at r-project.org mailing list
>>>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>>>> PLEASE do read the posting guide
>>>>> http://www.R-project.org/posting-guide.html
>>>>> and provide commented, minimal, self-contained, reproducible code.
>>>>>
>>>>
>>>> ______________________________________________
>>>> R-help at r-project.org mailing list
>>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>>> PLEASE do read the posting guide
>>>> http://www.R-project.org/posting-guide.html
>>>> and provide commented, minimal, self-contained, reproducible code.
>>>
>>> David Winsemius, MD
>>> Heritage Laboratories
>>> West Hartford, CT
>>>
>>> ______________________________________________
>>> R-help at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>> PLEASE do read the posting guide
>>> http://www.R-project.org/posting-guide.html
>>> and provide commented, minimal, self-contained, reproducible code.
>>>
>
> David Winsemius, MD
> Heritage Laboratories
> West Hartford, CT
>
>




More information about the R-help mailing list