The idea of modifying .DollarNames to recognize S4 methods is OK, but 
the problem could arise again.

It would be better to have a general solution.  The general problem as 
it seems is that an S3 generic called from within its package's 
namespace (or from some other 3rd package) will not detect S4 methods.  
In a sense, this is a natural consequence of namespace semantics and 
therefore not a bug.  We don't really want to fix up each case when it 
arises.

I can see two general solutions, one a reasonable fix that could likely 
be implemented for 2.12.0, the other a slight hack added to make the 
solution work now.

Both solutions start with the idea that we continue to treat the S3 
generic as an S3 generic (at least when it's called from the owning 
package's namespace).  We then define an S3 method for the S4 class.

Right now, that fails to recognize S4 inheritance (that's the fix that 
should be doable for 2.12.0; most of the mechanism needed is already in 
the UseMethod implementation).

The workaround/hack that *does* work now, I believe, is to insert a 
dummy S3 class into the mix and define the S3 .DollarNames method for it.

Example:
 > setOldClass("foo3")
 > .DollarNames.foo3 <- function(x, pattern)"bar"
 >
 > setClass("foo", contains = "foo3", representation(x = "numeric"))
[1] "foo"
 >
 > ff = new("foo")
 >
 > setClass("fee", contains = "foo")
[1] "fee"
 >
 > fe = new("fee")

Both ff$ and fe$ complete with "bar", running 2.11.0 from the command line.

John





On 5/29/10 12:37 PM, Romain Francois wrote:
> Le 29/05/10 20:23, Deepayan Sarkar a écrit :
>> On Sat, May 29, 2010 at 4:21 AM, Romain Francois
>> <rom...@r-enthusiasts.com>  wrote:
>>> Hello,
>>>
>>> I'm trying to make .DollarNames generic and implement a method for 
>>> it in a
>>> package. .DollarNames is the function that is now called to get 
>>> completion
>>> possibilities.
>>>
>>> My R code looks like this:
>>>
>>> setGeneric( ".DollarNames" )
>>>
>>> setClass("track",
>>>          representation(x="numeric", y="numeric"))
>>> ## A class extending the previous, adding one more slot
>>> setClass("trackCurve",
>>>     representation(smooth = "numeric"),
>>>     contains = "track")
>>>
>>> setMethod( ".DollarNames", signature( x = "track", pattern = 
>>> "character" ),
>>> function(x, pattern){
>>>         grep( pattern, c("foo", "bar"), value = TRUE )
>>> } )
>>>
>>>
>>> and the NAMESPACE :
>>>
>>> import( utils )
>>> exportMethods( .DollarNames )
>>> exportClasses( track, trackCurve )
>>>
>>>
>>> When I load the package, I can call .DollarNames explicitely :
>>>
>>>> require( foo )
>>>> x<- new( "trackCurve", x = 1:10, y = 1:10, smooth = 1:10 )
>>>> .DollarNames( x, "f" )
>>> [1] "foo"
>>>
>>> but completion does not work :
>>>
>>>> x$f<TAB>
>>> x$
>>
>> I guess because
>>
>>> utils:::.DollarNames(x, "f")
>> character(0)
>
> yes. hence the hack I used when replying which is probably not a good 
> idea, specially if two packages want it.
>
>> so the S4 generic is not being seen within the utils namespace. I
>> don't know what the right fix is...
>>
>> -Deepayan
>
> Perhaps something like the attached ?
>
> defining a generic in methods and use this one when methods dispatch 
> is on.
>
>
>>> What do I miss ?
>>>
>>> I've uploaded foo here : 
>>> http://addictedtor.free.fr/misc/rcpp/foo_1.0.tar.gz
>>>
>>> Romain
>
>
> ______________________________________________
> R-devel@r-project.org  mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>    

        [[alternative HTML version deleted]]

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to