Re: [R] OOP and passing by value

From: Joris Meys <jorismeys_at_gmail.com>
Date: Wed, 09 Jun 2010 15:05:30 +0200

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.
Received on Wed 09 Jun 2010 - 13:08:33 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 Wed 09 Jun 2010 - 13:20:27 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