[Rd] List S3 methods and defining packages
Renaud Gaujoux
renaud at mancala.cbio.uct.ac.za
Wed Jul 8 15:57:49 CEST 2015
Thanks Kevin, this indeed clarifies a bit the S3 method registration universe.
On 8 July 2015 at 15:48, Kevin Wright <kw.stat at gmail.com> wrote:
> Not sure if this answers your question, but you can't unregister a method. See
>
> http://tolstoy.newcastle.edu.au/R/help/06/07/30791.html
>
> Kevin Wright
>
>
> On Wed, Jul 8, 2015 at 5:09 AM, Renaud Gaujoux
> <renaud at mancala.cbio.uct.ac.za> wrote:
>> Thank you for your reply Martin.
>> Your code made me realize that S3 methods are added to the
>> .__S3MethodsTable__. of the package that defines the generic, not to
>> the ones defining the method itself.
>> How does things work in the case of a method from one package B
>> masking the one from another package A? I don't get any warning
>> message and there seems to be only one entry in the relevant
>> .__S3MethodsTable__.
>> Aren't these tables updated when the masking package B is detached?
>>
>> On 7 July 2015 at 21:01, Martin Morgan <mtmorgan at fredhutch.org> wrote:
>>> On 07/07/2015 02:05 AM, Renaud Gaujoux wrote:
>>>>
>>>> Hi,
>>>>
>>>> from the man page ?methods, I expected to be able to build pairs
>>>> (class,package) for a given S3 method, e.g., print, using
>>>>
>>>> attr(methods(print), 'info').
>>>>
>>>> However all the methods, except the ones defined in base or S4
>>>> methods, get the 'from' value "registered S3method for print", instead
>>>> of the actual package name (see below for the first rows).
>>>>
>>>> Is this normal behaviour? If so, is there a way to get what I want: a
>>>> character vector mapping class to package (ideally in loading order,
>>>> but this I can re-order from search()).
>>>
>>>
>>> It's the way it has always been, so normal in that sense.
>>>
>>> There could be two meanings of 'from' -- the namespace in which the generic
>>> to which the method belongs is defined, and the namespace in which the
>>> method is defined. I think the former is what you're interested in, but the
>>> latter likely what methods() might be modified return.
>>>
>>> For your use case, maybe something like
>>>
>>> .S3methodsInNamespace <- function(envir, pattern) {
>>> mtable <- get(".__S3MethodsTable__.", envir = asNamespace(envir))
>>> methods <- ls(mtable, pattern = pattern)
>>> env <- vapply(methods, function(x) {
>>> environmentName(environment(get(x, mtable)))
>>> }, character(1))
>>> setNames(names(env), unname(env))
>>> }
>>>
>>>
>>> followed by
>>>
>>> nmspc = loadedNamespaces()
>>> lapply(setNames(nmspc, nmspc), .S3methodsInNamespace, "^plot.")
>>>
>>> which reveals the different meanings of 'from', e.g.,
>>>
>>>> lapply(setNames(nmspc, nmspc), .S3methodsInNamespace,
>>>> "^plot.")["graphics"]
>>> $graphics
>>> stats graphics stats
>>> "plot.acf" "plot.data.frame" "plot.decomposed.ts"
>>> graphics stats stats
>>> "plot.default" "plot.dendrogram" "plot.density"
>>> stats graphics graphics
>>> "plot.ecdf" "plot.factor" "plot.formula"
>>> graphics stats graphics
>>> "plot.function" "plot.hclust" "plot.histogram"
>>> stats stats stats
>>> "plot.HoltWinters" "plot.isoreg" "plot.lm"
>>> stats stats stats
>>> "plot.medpolish" "plot.mlm" "plot.ppr"
>>> stats stats stats
>>> "plot.prcomp" "plot.princomp" "plot.profile.nls"
>>> graphics stats stats
>>> "plot.raster" "plot.spec" "plot.stepfun"
>>> stats graphics stats
>>> "plot.stl" "plot.table" "plot.ts"
>>> stats stats
>>> "plot.tskernel" "plot.TukeyHSD"
>>>
>>> Also this is for loaded, rather than attached, namespaces.
>>>
>>> Martin Morgan
>>>
>>>> Thank you.
>>>>
>>>> Bests,
>>>> Renaud
>>>>
>>>> visible
>>>> from generic isS4
>>>> print.abbrev FALSE registered
>>>> S3method for print print FALSE
>>>> print.acf FALSE registered
>>>> S3method for print print FALSE
>>>> print.AES FALSE registered
>>>> S3method for print print FALSE
>>>> print.agnes FALSE registered
>>>> S3method for print print FALSE
>>>> print.anova FALSE registered
>>>> S3method for print print FALSE
>>>> print.Anova FALSE registered
>>>> S3method for print print FALSE
>>>> print.anova.loglm FALSE registered
>>>> S3method for print print FALSE
>>>> print,ANY-method TRUE
>>>> base print TRUE
>>>> print.aov FALSE registered
>>>> S3method for print print FALSE
>>>>
>>>> ______________________________________________
>>>> R-devel at r-project.org mailing list
>>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>>
>>>
>>>
>>> --
>>> Computational Biology / Fred Hutchinson Cancer Research Center
>>> 1100 Fairview Ave. N.
>>> PO Box 19024 Seattle, WA 98109
>>>
>>> Location: Arnold Building M1 B861
>>> Phone: (206) 667-2793
>>>
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>
>
>
> --
> Kevin Wright
>
More information about the R-devel
mailing list