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

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

Index: src/library/utils/R/completion.R
===================================================================
--- src/library/utils/R/completion.R    (revision 52140)
+++ src/library/utils/R/completion.R    (working copy)
@@ -351,7 +351,8 @@
                        else
                        {
                            ## ## suffix must match names(object) (or 
ls(object) for environments)
-                           .DollarNames(object, pattern = sprintf("^%s", 
makeRegexpSafe(suffix)))
+                           dollarNames <- if( .isMethodsDispatchOn() ) 
methods:::.DollarNames else .DollarNames
+                           dollarNames(object, pattern = sprintf("^%s", 
makeRegexpSafe(suffix)))       
                            ## if (is.environment(object))
                            ## {
                            ##     ls(object,
Index: src/library/methods/R/makeBasicFunsList.R
===================================================================
--- src/library/methods/R/makeBasicFunsList.R   (revision 52140)
+++ src/library/methods/R/makeBasicFunsList.R   (working copy)
@@ -222,7 +222,14 @@
                        base::sample(x, size, replace=replace, prob=prob, ...),
               signature = c("x", "size"), where = where)
     setGenericImplicit("sample", where, FALSE)
-
+    
+    setGeneric( ".DollarNames", 
+       function(x, pattern) standardGeneric(".DollarNames"), 
+       useAsDefault = function(x,pattern) utils:::.DollarNames(x,pattern), 
+       signature = "x", 
+       where = where )
+    setGenericImplicit(".DollarNames", where, FALSE)
+    
     ## not implicitGeneric() which is not yet available "here"
     registerImplicitGenerics(where = where)
 }
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to