accessing source code in R packages
Dear Prof. Ripley: Thanks. This looks like a very useful summary. spencer graves
Prof Brian Ripley wrote:
The original reply was deliberately (I guess) vague. (I've removed the history, as attributions had already been removed, in violation of copyright law. If you cite someone, you MUST credit the author.) Sometimes a little knowledge is a dangerous thing, and we have had a number of partially true answers. Spreading confusion between the S4 classes of the 'methods' package and the (sometimes called S3) classes of base R is also dangerous. The R documentation refers to S3 methods and classes unless otherwise stated (and in the methods package documentation). Please follow that lead. On Thu, 22 Sep 2005, Spencer Graves wrote:
Is there general documentation on a procedure to follow to:
(a) Find what methods are available for a particular class of
objects?
?methods, unless you mean an S4 class. Be careful here: methods `for a particular class' are not all that might be dispatched, as methods for classes the object inherits from may also be used. Thus "lm" methods may be invoked for "glm" objects, and you may need to call methods() for all the classes the object inherits from.
(b) Find what classes of objects have methods defined for a partilar generic function?
?methods, unless you mean S4 classes (and that help page leads you to the right place for those).
(c) Get the code that's actually used?
getAnywhere() on the asterisked results of (a) or (b).
For a specific generic and a specific class, getS3method().
[There is a potential gap here as the "bar" method for class "foo" need
not be called foo.bar(). So guessing the name may not work, but
getS3method("foo", "bar") will. AFAIK there are no live examples of this.]
For example, I recently needed to access numbers associated with an
object of class "lmer". Sundar suggested I use with 'getMethod("show",
"summary.lmer")'. However, this doesn't work with the example below.
(I think that was intended to refer to the default method for princomp, which is not an S4 generic in base R.
methods("princomp")
[1] princomp.default* princomp.formula* Non-visible functions are asterisked
getAnywhere("princomp.default") # works
getS3Method("princomp", "default") # works
showMethods("princomp")
Function "princomp": <not a generic function> ) show() is an S4 generic, not an S3 generic. ?methods points you to how to explore S4 generics.
library(lme4)
... (and drink some coffee while you wait)
methods(show)
no methods were found Warning message: function 'show' appears not to be generic in: methods(show)
showMethods("show")
Function "show": object = "ANY" object = "traceable" object = "ObjectsWithPackage" object = "MethodDefinition" object = "MethodWithNext" object = "genericFunction" object = "classRepresentation" object = "ddenseMatrix" object = "Matrix" object = "lmer" object = "summary.lmer" object = "VarCorr" object = "sparseMatrix" object = "lmList"
selectMethod("show", "summary.lmer")
Method Definition: function (object) ... Here getMethod() will also work, but selectMethod() is more likely to find `the code that's actually used'.
Spencer Graves, PhD Senior Development Engineer PDF Solutions, Inc. 333 West San Carlos Street Suite 700 San Jose, CA 95110, USA spencer.graves at pdf.com www.pdf.com <http://www.pdf.com> Tel: 408-938-4420 Fax: 408-280-7915