[R] OOP and passing by value

Henrik Bengtsson hb at stat.berkeley.edu
Wed Jun 9 15:12:49 CEST 2010


Pass an object of, or containing an, environment.  Then whenever you
modify any object "inside" the environment, the changes will remain
also when exiting from the function(s).  This has been used by many
for quite some time and is the standard way to do it, if you need this
feature.  See packages such as R.oo and proto for complete solutions.

Using substitute(this) is not safe when doing nested calling, and
assigning to a global environment is not something you really want to
do.

/Henrik

On Wed, Jun 9, 2010 at 3:05 PM, Joris Meys <jorismeys at gmail.com> wrote:
> In case you want the function setData to change the object itself
> (which is often a dangerous idea!), you can use instead :
>
> setMethod("setData","test",
>  function(this,fcn,k){
>    Name <- deparse(substitute(this))
>    this at t <- as.numeric(seq(-k,k))/(2*k+1)
>    this at f <- sapply(this at t,FUN=fcn)
>    assign(Name,this,.GlobalEnv)
>  }
> )
>
> #-----------------------------------------------------------
> tst <- new("test")
> fcn <- function(u){ sin(2*pi*u) }
> setData(tst,fcn,5)
> tst at t
> [1] -0.4545455 -0.3636364 -0.2727273 -0.1818182 -0.0909091  0.0000000
> 0.0909091  0.1818182  0.2727273  0.3636364  0.4545455
>
>
> On Wed, Jun 9, 2010 at 2:36 PM, Joris Meys <jorismeys at gmail.com> wrote:
>> by returning the object ?
>>
>> setMethod("setData","test",
>>  function(this,fcn,k){
>>   this at t <- as.numeric(seq(-k,k))/(2*k+1)
>>   this at f <- sapply(this at t,FUN=fcn)   #changed!
>>   return(this)                                          #changed!
>>  }
>> )
>>
>> #-----------------------------------------------------------
>>> tst <- new("test")
>>> fcn <- function(u){ sin(2*pi*u) }
>>> New <- setData(tst,fcn,5)
>>> New at t
>> [1] -0.4545455 -0.3636364 -0.2727273 -0.1818182 -0.0909091  0.0000000
>> 0.0909091  0.1818182  0.2727273  0.3636364  0.4545455
>>
>>
>> On Wed, Jun 9, 2010 at 2:28 PM, michael meyer <mjhmeyer at googlemail.com> wrote:
>>> Greetings,
>>>
>>> I love the R system and am sincerely grateful for the great effort the
>>> product and contributors
>>> are delivering.
>>>
>>> My question is as follows:
>>>
>>> I am trying to use S4 style classes but cannot write functions that modify
>>> an object
>>> because paramter passing is by value.
>>> For example I want to do this:
>>>
>>> setGeneric("setData", function(this,fcn,k){ standardGeneric("setData") })
>>>
>>> setClass(
>>>  "test",
>>>  representation(f="numeric", t="numeric")
>>> )
>>> setMethod("setData","test",
>>>  function(this,fcn,k){
>>>    this at t <- as.numeric(seq(-k,k))/(2*k+1)
>>>    this at f <- sapply(t,FUN=fcn)
>>>  }
>>> )
>>>
>>> #-----------------------------------------------------------
>>> tst <- new("test")
>>> fcn <- function(u){ sin(2*pi*u) }
>>> setData(tst,fcn,100)
>>> tst at t   # it's still empty because of pass by value
>>>
>>>
>>> How can this be handled?
>>>
>>>
>>> Many thanks,
>>>
>>> Michael
>>>
>>>        [[alternative HTML version deleted]]
>>>
>>> ______________________________________________
>>> 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.
>>>
>>
>>
>>
>> --
>> Joris Meys
>> Statistical consultant
>>
>> Ghent University
>> Faculty of Bioscience Engineering
>> Department of Applied mathematics, biometrics and process control
>>
>> tel : +32 9 264 59 87
>> Joris.Meys at Ugent.be
>> -------------------------------
>> Disclaimer : http://helpdesk.ugent.be/e-maildisclaimer.php
>>
>
>
>
> --
> Joris Meys
> Statistical consultant
>
> Ghent University
> Faculty of Bioscience Engineering
> Department of Applied mathematics, biometrics and process control
>
> tel : +32 9 264 59 87
> Joris.Meys at Ugent.be
> -------------------------------
> Disclaimer : http://helpdesk.ugent.be/e-maildisclaimer.php
>
> ______________________________________________
> 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.
>



More information about the R-help mailing list