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
<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
--
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
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel