[R] Call by reference or suggest workaround

Chidambaram Annamalai quantumelixir at gmail.com
Sat Jun 19 16:56:51 CEST 2010


Doh! I never thought about nesting functions.

Thanks a bunch!
Chillu

On 6/19/10, Duncan Murdoch <murdoch.duncan at gmail.com> wrote:
> On 19/06/2010 10:32 AM, Chidambaram Annamalai wrote:
>> I have written code to compute multi-indices in R [1] and due to the
>> recursive nature of the computation I need to pass around the *same*
>> matrix object (where each row corresponds to one multi-index). As pass
>> by reference wasn't the default behavior I declared a global matrix
>> (mat) and used the <<- operator to write to the global matrix. So the
>> usage would be to call genMultiIndices(3,2) for side effects to
>> generate all multi-indices of length 3 and sum 2. And then access the
>> global matrix.
>>
>> However, after coding this I can't seem to export the global matrix
>> object (in the NAMESPACE file) and still retain mutability since its
>> binding is "locked" (R throws an error). Can I somehow unlock this?
>>
>> Ideally I would want to pass around the same matrix to the recursive
>> function. Is that possible? If not, could someone please suggest a
>> workaround to use the code in an R package?
>
>
> If you pass the object to multiple functions it will only create a new
> copy when necessary due to modifying it, so the cost of passing it down
> to every recursive call is not so large as you seem to think.  But it's
> not zero cost, passing arguments to functions costs a little bit.
>
> You can avoid this using nested functions and <<- as you had before.
> That is, instead of making your recursive function a top level function
> so that <<- assigns into the namespace environment (which is what's
> causing the error), make it a nested function within another, and do
> your assignments to the outer frame.  For example,
>
> outer <- function(args) {
>
>   mat <- matrix(NA, 3,3)
>
>   recursive <- function() {
>     mat <<- newvalue  # does the assignment into outer's frame
>     if (!stop) recursive()
>   }
>
> }
>
> Duncan Murdoch
>



More information about the R-help mailing list