assigning objects from .C/.Call
On Wed, 25 Apr 2001, David James wrote:
Hi, On Tue, 24 Apr 2001, Prof Brian D Ripley wrote:
Date: Tue, 24 Apr 2001 20:24:35 +0100 (BST) From: To: David James <dj@research.bell-labs.com> cc: <r-devel@stat.math.ethz.ch> Subject: Re: [Rd] assigning objects from .C/.Call MIME-Version: 1.0 On Tue, 24 Apr 2001, David James wrote:
Hi, In section 4.6.7 of "Writing R Extensions" (Version 1.2.1, 2001-01-15) the C function defineVar() is described as "... the equivalent of assign(symbol, value, envir = rho, inherits = FALSE) ..." I interpreted the above (wrongly) as meaning that defineVar() makes a copy of its "value" argument into the object whose name is specified in "symbol" in the "rho" environment (that's how assign() works at the R/S level). However, this is not exactly how defineVar() appears to work. In particular, it appears to assign the object in the environment "rho", but further changes in the C code to the object are reflected in the "assigned" object in rho (i.e., no actual copy of the object is made). I can see that the implemented behavior is quite useful, but it's not exactly equivalent to assign(). Perhaps the documentation should be more explicit and add a sentence to warn users that the data part of the object is shared? (The sentence may need to be more precise, though.)
I'm happy to do so, but can someone provide the more precise sentence, please. When exactly does R make a copy?
Using Peter Delgaard's suggestion (and John Chambers', privately)
I suggest the following modified paragraph (edited from R-exts.texi):
@code{defineVar}
creates a new binding or changes the value of an existing binding in the
specified environment frame; in this respect, it is analogous to
@code{assign(symbol, value, envir = rho, inherits = FALSE)},
but unlike \code{assign}, @code{defineVar} does not make a
copy of the object (you can assign a copy of the object in the
environment frame @code{rho} using
@code{defineVar(symbol, duplicate(value), rho)}).
Thanks, will add (a variant of). The real issue is that assign() allows `value' to be an expression, and so uses the value of evaluating the expression, not that of a variable. Brian
Brian D. Ripley, ripley@stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272860 (secr) Oxford OX1 3TG, UK Fax: +44 1865 272595 -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html Send "info", "help", or "[un]subscribe" (in the "body", not the subject !) To: r-devel-request@stat.math.ethz.ch _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._