[R-pkg-devel] Two packages with the same generic function

Bert Gunter bgunter@4567 @end|ng |rom gm@||@com
Mon Jun 22 19:40:28 CEST 2020


...
and just to add to the query, assume the author of pkg B did (does) not
know of pkg A and so, for example, could (did) not import any of pkg A's
content into B. Given that there are at the moment ~20,000 packages out
there, this does not seem to be an unreasonable assumption. One may even
further assume that the user may not know that (s)he has package B loaded,
as it may be a dependency of another package that (s)he uses. I certainly
don't keep track of all the dependencies of packages I use.

Under these assumptions, is there any more convenient alternative to
Wolfgang's pkgA:foo(x) explicit call under such assumptions? If pkgA has a
long name, what might one do?

Bert Gunter

"The trouble with having an open mind is that people keep coming along and
sticking things into it."
-- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )


On Mon, Jun 22, 2020 at 10:00 AM Viechtbauer, Wolfgang (SP) <
wolfgang.viechtbauer using maastrichtuniversity.nl> wrote:

> Hi All,
>
> Let's say there are two packages pkgA and pkgB, both of which have a
> generic function
>
> foo <- function(x, ...)
>    UseMethod("foo")
>
> and pkgA has a method for objects of class "A":
>
> foo.A <- function(x, ...)
>    print(x)
>
> and pkgB has a method for objects of class "B":
>
> foo.B <- function(x, ...)
>    plot(x)
>
> Both packages export foo and their method and declare their respective S3
> methods, so:
>
> export(foo)
> export(foo.A)
> S3method(foo, A)
>
> in NAMESPACE of pkgA and
>
> export(foo)
> export(foo.B)
> S3method(foo, B)
>
> in NAMESPACE of pkgB.
>
> If a user loads pkgA first and then pkgB, this fails:
>
> library(pkgA)
> library(pkgB)
> x <- 1:4
> class(x) <- "A"
> foo(x)
>
> Error in UseMethod("foo") :
>   no applicable method for 'foo' applied to an object of class "A"
>
> and vice-versa. Of course, pkgA::foo(x) works. Aside from pkgA importing
> foo() or vice-versa, is there some other clever way to make this work? In
> earlier versions of R (at least in 3.6.3), this used to work (i.e., the
> generic foo() from pkgB would find method foo.A() and vice-versa), but not
> since 4.0.0.
>
> Best,
> Wolfgang
>
> ______________________________________________
> R-package-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-package-devel
>

	[[alternative HTML version deleted]]



More information about the R-package-devel mailing list