From savicky at cs.cas.cz  Wed Sep 26 11:29:24 2007
From: savicky at cs.cas.cz (Petr Savicky)
Date: Wed, 26 Sep 2007 11:29:24 +0200
Subject: [Rd] modifying large R objects in place
Message-ID: <20070926092924.GA9879@cs.cas.cz>

I have a C function, which performs a transformation
of a large integer matrix. The matrix may be of size 1.6GB,
so I can have only one copy in RAM and have to modify it
in place. This is possible using .Call and works fine. For
debugging, I need two copies of a smaller matrix and modify only
one of them. This may also be done, for example, by
  A <- some integer matrix
  B <- A + as.integer(0)
  .Call("transform", A)
Then, B is still the original and A is the transformed one.
Up to now, I do not have any real problem with this, but there
are things, which could help me. Namely the following ones:

1. Is there a general way to duplicate an R object on the
   level of R language? I would use it instead of
      B <- A + as.integer(0)
   Looking for the keywords "duplicate" and "copy" in help pages
   and R-exts did not find what I need.

2. Is there a way how a C function can verify that its
   argument does not share data with other objects?
   I included a test of NAMED(A) in my C function, but I do
   not know, whether it may be used for the purpose which I need.
   I did not find a way how to generate an R object with
   NAMED equal 0. Is this possible on the level of R language?
   If yes, I will require that the argument passed to my
   function is generated in this way and the function
   will refuse to modify it if it is not so.
   The documentation suggests to call "duplicate", if the
   data are shared, but I cannot afford this due to memory.
   So, I can only stop if NAMED is not 0.

I appreciate, if anybody could give me advice on the above things.

Petr Savicky.



[Rd] modifying large R objects in place
Petr Savicky