From murdoch at stats.uwo.ca  Wed Feb 27 12:53:11 2008
From: murdoch at stats.uwo.ca (Duncan Murdoch)
Date: Wed, 27 Feb 2008 06:53:11 -0500
Subject: [Rd] Generic Functions
In-Reply-To: <01c401c87921$fe233120$6b0aa8c0@mobil>
References: <001c01c876e5$dc10dc60$2101a8c0@mobil><47C1A248.4090909@fhcrc.org>	<01f101c877b5$7af4d230$6b0aa8c0@mobil>	<6phfxvghnp3.fsf@gopher4.fhcrc.org>
	<01c401c87921$fe233120$6b0aa8c0@mobil>
Message-ID: <47C54F27.1000808@stats.uwo.ca>

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



[Rd] Generic Functions
Duncan Murdoch