[Rd] Huge matrices in .Call
Thomas Lumley
tlumley at u.washington.edu
Thu Aug 24 20:48:31 CEST 2006
On Thu, 24 Aug 2006, Hin-Tak Leung wrote:
> Dominick Samperi wrote:
>> I assume that the fact that SEXP's passed through .Call
>> are read-only is a convention, consistent with R semantics.
Yes
>> This can be awkward when huge matrices are passed
>> as in:
>> newP <- .Call("myfunc", P)
>> because this would cause the huge matrix to be copied.
Indeed.
>> Is there any danger if I violate the convention in cases
>> like this and modify the SEXP matrix parameter directly,
>> instead of forcing R to make a copy of it every time
>> myfunc is called? (This seems to work in my testing.)
>
> Prof. Ripley is probably going to say something about this...
> but I think as long as (1) you tell the garbage collector
> about you going to mess around with the input with
> PROTECT() (this is probably automatic for input to .Call()
> so may not be necessary), (2) you are doing exact in-place
> changes, no resizing, no messing around the attributes,
> no relocations elsewhere, etc, then nobody needs to get upset
> about you messing around with the internal of a matrix, so to speak,
> and technically it should work, *although doing so is very much
> frown upon*.
That isn't quite sufficient. If another variable (perhaps in a function
that calls your function) is using the same storage as your variable P
then both will be changed. This may not be what the user expects.
Also, if you return newP as well as modifying P they will point to the
same storage so modifying one will modify the other in the future (at
least until one of them gets duplicated).
It's probably less dangerous with a matrix than with a list or data frame
that might share only part of its memory with another variable. However, R
does provide external pointer objects as a way to pass objects by
reference without breaking the behaviour of the rest of the language. It's
more work to use them but cleaner.
-thomas
Thomas Lumley Assoc. Professor, Biostatistics
tlumley at u.washington.edu University of Washington, Seattle
More information about the R-devel
mailing list