[Rd] RFC: methods() and showMethods() {was "debug"}
Martin Maechler
maechler at stat.math.ethz.ch
Wed Jul 29 11:37:48 CEST 2009
(a new thread, on purpose)
>>>>> "RobG" == Robert Gentleman <rgentlem at fhcrc.org>
>>>>> on Mon, 27 Jul 2009 16:55:50 -0700 writes:
RobG> Hi, I just committed a change to R-devel so that if
RobG> debug is called on an S3 generic function, all methods
RobG> will also automatically have debug turned on for them
RobG> (if they are dispatched to from the generic).
very nice.
RobG> I hope to be able to extend this to S4 and a few
RobG> other cases that are currently not being handled over
RobG> the next few weeks.
that (S4) will be very useful for me, thank you in advance,
Robert!
A somewhat related issue:
As many of the R-devel readers will know, there has been quite
a nice ongoing effort to make S3 and S4 methods and classes more
compatible.
One issue here, notably for inexperienced programmeRs,
is also the fact that
methods(f) only tells about S3-methods for 'f',
and showMethods(f) only mentions S4 ones.
This is not at all design error, as indeed S3 and S4 dispatch is quite
different (notably as the latter allows multiple dispatch and
hence uses the nice concept of "signature"),
used to be more incompatible and, indeed, methods(f) *still*
warns, often wrongly, if it finds that f is a (S4) generic function.
As this is an RFC, let me just make a few more propositional
points, and we (R core) will be happy to receive constructive
feedback from outside the core team as well.
Propositions / Ideas :
[ Using the example of having Matrix:
library(Matrix)
]
1) methods(f) should become a bit smarter when it sees that f is
an S4 generic, and not say, e.g., for
> methods(qr)
...
'qr' is a formal generic function; S3 methods will not likely be found
...
but rather at least "look" to see if there's an "ANY" method containing
UseMethod() (*1),
2) and if there is, or maybe in any case, methods() should then
also call showMethods() to show the S4 methods;
or it would suggest the to user to call 'showMethods(..)'
3) showMethods(.) : It could/should
a) look for S3 dispatch symptoms such as
UseMethod(.) in its "ANY" methods
b) call methods() in any case
and then possibly mention the result of methods() in any case,
*plus* ... that's probably the most difficult part ...
warn if there are S3 methods {as per 'b)'} that seem not be
called at all {as per a)}, but that would also have to
consider .Primitive s with C internal (S3 and S4) dispatch.
As you see, these are partly concrete proposals, partly just
ideas, asking for feedback, from you, experienced
programmeRs, ...
Martin Maechler, ETH Zurich
---
*1) as there will always be if the S4 methods
have been setup properly and *after* the S3 ones.
This will typically be the case for situations when there are
old traditional S3 methods in "base R", and a package adds new
modern S4 methods.
More information about the R-devel
mailing list