Re: [R] Call by reference or suggest workaround

From: Duncan Murdoch <murdoch.duncan_at_gmail.com>
Date: Sat, 19 Jun 2010 10:53:29 -0400

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



R-help_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code. Received on Sat 19 Jun 2010 - 14:56:15 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Sat 19 Jun 2010 - 15:30:33 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.

list of date sections of archive