[Rd] S4 dispatch for .DollarNames (utils)

Romain Francois romain at r-enthusiasts.com
Sun May 30 07:58:03 CEST 2010


Thanks. I'll apply the nice workaround for now.

Romain

Le 29/05/10 23:15, John Chambers a écrit :
> 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
>>> <romain at 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 at r-project.org  mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>


-- 
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
|- http://bit.ly/99bz5D : highlight 0.1-9
|- http://bit.ly/9CQ66r : RMetrics 2010
`- http://bit.ly/bklUXt : RcppArmadillo 0.2.1





More information about the R-devel mailing list