[Rd] Generic Functions
Duncan Murdoch
murdoch at stats.uwo.ca
Wed Feb 27 12:53:11 CET 2008
Dominik Locher wrote:
> Thanks a lot for your explanation, which I higly appreciate. But I have
> still a problem...
>
> Think about 2 persons, each of them create their own package. Both define a
> generic function "setType" with different arguments.
>
> Person 1: setType(obj, valX)
> Person 2: setType(spec)
>
> If I require the package of person 1, everything works fine.
>
> If I call the second package afterwards, I will get an error, because the
> generic function already exists.
>
> How can I solve this conflict? How can I define a new generic function which
> has different arguments without getting in trouble with the first package?
> Is there a way to define functions, which belongs to a specific class
> without getting in troubles with other packages?
>
Use a NAMESPACE.
Duncan Murdoch
> Thanks a lot for your help.
> Dominik
>
>
> -----Ursprüngliche Nachricht-----
> Von: Martin Morgan [mailto:mtmorgan at fhcrc.org]
> Gesendet: Montag, 25. Februar 2008 19:54
> An: Dominik Locher
> Betreff: Re: AW: [R] Generic Functions
>
> Things are different in R. You can't protect a new function from hiding your
> function, just as
>
>
>> print(1:10)
>>
> [1] 1 2 3 4 5 6 7 8 9 10
>
>> print <- function(x) "oops"
>> print(1:10)
>>
> [1] "oops"
>
>> rm(print)
>> print(1:10)
>>
> [1] 1 2 3 4 5 6 7 8 9 10
>
> Note that the redefinition hides but does not remove 'print' function.
>
> Generics don't really belong with classes, but if you think about it
> something like
>
> class Foo {
> function bar() {}
> }
>
> foo = new Foo;
> $foo->bar()
>
> in php is very similar to
>
>
>> setClass("Foo", "list")
>> setGeneric("bar", function(x) standardGeneric("bar")) setMethod("bar",
>> "Foo", function(x) {}) foo = new("Foo")
>> bar(foo)
>>
>
> i.e., set a method on the generic function. Someone could write another
> method 'bar' operating on a different object, and it would coexist with your
> method.
>
> Martin
>
> "Dominik Locher" <dominik.locher at bondsearch.ch> writes:
>
>
>> Hi
>>
>> Many thanks for your explanation. Just another short question. How can
>> I make sure that if I greate a new class with functions, that nobody
>> can change this functions anymore or as you mentioned overwrite
>> unintended this function (setType).
>>
>> In OOP i.e. in php I have a class and specific functions belongs to
>> this class. How can I do the same in R with generic functions? or is
>> there another way?
>>
>> Thanks for your help.
>>
>> Dominik
>>
>>
>> PS: I will send questions about S4 to R-devel at r-project.org in future.
>>
> ;-).
>
>> -----Ursprüngliche Nachricht-----
>> Von: Martin Morgan [mailto:mtmorgan at fhcrc.org]
>> Gesendet: Sonntag, 24. Februar 2008 17:59
>> An: Dominik Locher
>> Cc: r-help at r-project.org
>> Betreff: Re: [R] Generic Functions
>>
>> See the 'useAsDefault' argument to setGeneric.
>>
>> As an aside, if 'setType<-' is meant to be a 'setter' to change the
>> value of a slot 'type', then I find the syntax a little redundant --
>> it's use
>>
>> > setType(x) <- "foo"
>>
>> implies that it is already a 'setter' without 'set' at the front. Why
>> not just
>>
>> > type(x) <- "foo"
>>
>> (though perhaps 'type' is not such a good name, either)?
>>
>> As a second aside, if you're writing code that you expect to be used
>> with fPortfolio, then having two functions with the same name but
>> different signatures or overall goals will confuse your user -- with
>> fPortfolio,
>> setType<- works fine, but then for mysterious reasons (i.e., when your
>> package is loaded, with a different definition of setType<-) code that
>> worked before no longer works! So I'd either use setType in a way
>> consistent with it's use in fPortfolio, or define a new generic for
>> your own purposes
>> (setType<- is not a generic in my version of fPortfolio,
>>
>> > packageDescription('fPortfolio')$Version
>> [1] "260.72"
>>
>> ).
>>
>> As a third aside, I think questions about S4 probably belong on
>> R-devel, as they seem to fall in the realm of 'questions likely to
>> prompt discussion unintelligible to non-programmers' (from the R-devel
>> mailing list description).
>>
>> Martin
>>
>> Dominik Locher wrote:
>>
>>> Hi
>>>
>>> I have some problems in defining new generic functions and classes.
>>> Just have a look at the following example:
>>>
>>>
>>> require(fPortfolio)
>>>
>>> setClass("PROBECLASS",
>>> representation(
>>> type="character"
>>> )
>>> )
>>>
>>> isGeneric("setType<-")
>>> #Returns
>>> TRUE
>>>
>>> #I would like to define a specific function for class PROBECLASS with
>>> other arguments than for the generic function "setType" of fPortfolio.
>>> setGeneric("setType<-", function(object, value)
>>> standardGeneric("setType<-"))
>>>
>>> #Returns
>>> Fehler in makeGeneric(name, fdef, fdeflt, group = group, valueClass =
>>> valueClass, :
>>> the formal arguments of the generic function for "setType<-"
>>> (object,
>>> value) differ from those of the non-generic to be used as the default
>>> (spec,
>>> value)
>>>
>>> setReplaceMethod("setType", "PROBECLASS", function(object, value){
>>>
>>> object at type <- value
>>> object
>>>
>>> })
>>>
>>> #Example
>>> obj = new("PROBECLASS")
>>> setType(obj) = "test"
>>> obj
>>>
>>>
>>> ######
>>> If I don't require fPortfolio it works fine. However, is it not
>>> possible to create two generic functions with the same name but
>>> different
>>>
>> arguments?
>>
>>> setType for fPortfolio may be differ completely from setType of
>>> PROBECLASS...
>>> What's the best way to have functions which belongs to an object of a
>>> specific class? I had a look at the paper "S4 Classes in 15 pages,
>>> more or less" (feb12, 2003), however, I could not found what I did
>>>
>> wrong...
>>
>>> Any help is highly appreciated.
>>>
>>> Thanks
>>> Dominik
>>>
>>> ______________________________________________
>>> 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-devel
mailing list