[Rd] modifying large R objects in place
Petr Savicky
savicky at cs.cas.cz
Thu Sep 27 15:13:17 CEST 2007
On Wed, Sep 26, 2007 at 10:52:28AM -0700, Byron Ellis wrote:
> For the most part, doing anything to an R object result in it's
> duplication. You generally have to do a lot of work to NOT copy an R
> object.
Thank you for your response. Unfortunately, you are right. For example,
the allocated memory determined by top command on Linux may change during
a session as follows:
a <- matrix(as.integer(1),nrow=14100,ncol=14100) # 774m
a[1,1] <- 0 # 3.0g
gc() # 1.5g
In the current applicatin, I modify the matrix only using my own C code
and only read it on R level. So, the above is not a big problem for me
(at least not now).
However, there is a related thing, which could be a bug. The following
code determines the value of NAMED field in SEXP header of an object:
SEXP getnamed(SEXP a)
{
SEXP out;
PROTECT(out = allocVector(INTSXP, 1));
INTEGER(out)[0] = NAMED(a);
UNPROTECT(1);
return(out);
}
Now, consider the following session
u <- matrix(as.integer(1),nrow=5,ncol=3) + as.integer(0)
.Call("getnamed",u) # 1 (OK)
length(u)
.Call("getnamed",u) # 1 (OK)
dim(u)
.Call("getnamed",u) # 1 (OK)
nrow(u)
.Call("getnamed",u) # 2 (why?)
u <- matrix(as.integer(1),nrow=5,ncol=3) + as.integer(0)
.Call("getnamed",u) # 1 (OK)
ncol(u)
.Call("getnamed",u) # 2 (so, ncol does the same)
Is this a bug?
Petr Savicky.
More information about the R-devel
mailing list