From dominik.locher at bondsearch.ch  Wed Feb 27 10:20:28 2008
From: dominik.locher at bondsearch.ch (Dominik Locher)
Date: Wed, 27 Feb 2008 10:20:28 +0100
Subject: [Rd] Generic Functions
In-Reply-To: <6phfxvghnp3.fsf@gopher4.fhcrc.org>
References: <001c01c876e5$dc10dc60$2101a8c0@mobil><47C1A248.4090909@fhcrc.org>
	<01f101c877b5$7af4d230$6b0aa8c0@mobil>
	<6phfxvghnp3.fsf@gopher4.fhcrc.org>
Message-ID: <01c401c87921$fe233120$6b0aa8c0@mobil>

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?

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.
>

-- 
Martin Morgan
Computational Biology / Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N.
PO Box 19024 Seattle, WA 98109

Location: Arnold Building M2 B169
Phone: (206) 667-2793



[Rd] Generic Functions
Dominik Locher