Creating and Using Objects in R

2 messages Options
Embed this post
Permalink
Lorenzo Isella

Creating and Using Objects in R

Reply Threaded More More options
Print post
Permalink
Dear All,
I am not very into object-oriented programming, but I would like to
learn the ropes for some R applications.
Quoting from the online R language definition (paragraph 5.1)

> Consider the following simple example. A point in two-dimensional
> Euclidean space can be specified by its Cartesian (x-y) or polar
> (r-theta) coordinates. Hence, to store information about the location
> of the point, we could define two classes, |"xypoint"| and
> |"rthetapoint"|. All the `xypoint' data structures are lists with an
> x-component and a y-component. All `rthetapoint' objects are lists
> with an r-component and a theta-component.
>
> Now, suppose we want to get the x-position from either type of object.
> This can easily be achieved through generic functions. We define the
> generic function |xpos| as follows.
>
>      xpos <- function(x, ...)
>          UseMethod("xpos")
>  
>
> Now we can define methods:
>
>      xpos.xypoint <- function(x) x$x
>      xpos.rthetapoint <- function(x) x$r * cos(x$theta)
>  
>
> The user simply calls the function |xpos| with either representation
> as the argument. The internal dispatching method finds the class of
> the object and calls the appropriate methods.
>
I am a bit confused: when calling e.g. xpos.rthetapoint, I understand
that x contains the polar representation of a point, so x=(r,theta),
but  how do I exactly  write it to pass it to xpos.rthetapoint? I have
made several attempts, but so far none of them works, so I may have
misunderstood something.
Many thanks

Lorenzo

______________________________________________
[hidden email] 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.
Gabor Grothendieck

Re: Creating and Using Objects in R

Reply Threaded More More options
Print post
Permalink
Here it is done without S3.  Note that UseMethod
is basically just an alternative to an if statement.
Perhaps this makes it more understandable.

x1 <- list(x = 1, y = 2)
class(x1) <- "xypoint"
x2 <- list(r = 1, theta = pi/2)
class(x2) <- "rthetapoint"

XPOS <- function(x) {
        if (inherits(x, "xypoint")) xpos.xypoint(x)
        else if (inherits(x, "rthetapoint")) xpos.rthetapoint(x)
        else stop("Cannot find appropriate class")
}

XPOS(x1) # without S3
xpos(x1) # using S3

XPOS(x2) # without S3
xpos(x2) # using S3


On Thu, Jul 9, 2009 at 12:24 PM, Lorenzo Isella<[hidden email]> wrote:

> Dear All,
> I am not very into object-oriented programming, but I would like to learn
> the ropes for some R applications.
> Quoting from the online R language definition (paragraph 5.1)
>
>> Consider the following simple example. A point in two-dimensional
>> Euclidean space can be specified by its Cartesian (x-y) or polar (r-theta)
>> coordinates. Hence, to store information about the location of the point, we
>> could define two classes, |"xypoint"| and |"rthetapoint"|. All the `xypoint'
>> data structures are lists with an x-component and a y-component. All
>> `rthetapoint' objects are lists with an r-component and a theta-component.
>>
>> Now, suppose we want to get the x-position from either type of object.
>> This can easily be achieved through generic functions. We define the generic
>> function |xpos| as follows.
>>
>>     xpos <- function(x, ...)
>>         UseMethod("xpos")
>>
>> Now we can define methods:
>>
>>     xpos.xypoint <- function(x) x$x
>>     xpos.rthetapoint <- function(x) x$r * cos(x$theta)
>>
>> The user simply calls the function |xpos| with either representation as
>> the argument. The internal dispatching method finds the class of the object
>> and calls the appropriate methods.
>>
> I am a bit confused: when calling e.g. xpos.rthetapoint, I understand that x
> contains the polar representation of a point, so x=(r,theta), but  how do I
> exactly  write it to pass it to xpos.rthetapoint? I have made several
> attempts, but so far none of them works, so I may have misunderstood
> something.
> Many thanks
>
> Lorenzo
>
> ______________________________________________
> [hidden email] 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.
>

______________________________________________
[hidden email] 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.