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