From renaud at mancala.cbio.uct.ac.za  Wed Jul  8 12:09:44 2015
From: renaud at mancala.cbio.uct.ac.za (Renaud Gaujoux)
Date: Wed, 8 Jul 2015 12:09:44 +0200
Subject: [Rd] List S3 methods and defining packages
In-Reply-To: <559C2200.4070305@fredhutch.org>
References: <CAHavPHE_A=Ynngg41MnUnWxDUvq47LwT4HYwPGiJYXoSLO5BKw@mail.gmail.com>
	<559C2200.4070305@fredhutch.org>
Message-ID: <CAHavPHFZgOQTMuyXcu-Zn39Yo2y_xn=o=V0yuONGm_3qTjaduQ@mail.gmail.com>

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
>



[Rd] List S3 methods and defining packages
Renaud Gaujoux