[R] OOP and passing by value

Joris Meys jorismeys at gmail.com
Wed Jun 9 15:05:30 CEST 2010


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



More information about the R-help mailing list