[R-pkg-devel] [External] Re: Farming out methods to other packages

Lenth, Russell V ru@@e||-|enth @end|ng |rom u|ow@@edu
Sat Aug 10 22:00:01 CEST 2019


Thanks, Duncan. That's helpful.

In addition, I confess I had a closing parenthesis in the wrong place.
    Should be:    . . .   .GlobalEnv), silent = TRUE)

Cheers,

Russ

-----Original Message-----
From: Duncan Murdoch <murdoch.duncan using gmail.com> 
Sent: Saturday, August 10, 2019 2:43 PM
To: Lenth, Russell V <russell-lenth using uiowa.edu>; Iñaki Ucar <iucar using fedoraproject.org>
Cc: r-package-devel using r-project.org
Subject: Re: [R-pkg-devel] [External] Re: Farming out methods to other packages

On 10/08/2019 3:27 p.m., Lenth, Russell V wrote:
> Hmmmm, I thought of an approach -- a kind of manual dispatch 
> technique. My generic is
> 
> recover_data <- function(object, ...) {
>      rd <- try(getS3method("recover_data", class(object)[1], envir = .GlobalEnv, silent = TRUE))
>      if (!inherits(rd, "try-error"))
>          rd(object, ...)
>      else
>          UseMethod("recover_data")
> }
> 
> and similar for emm_basis. The idea is it tries to find the method among globally registered ones, and if so, it uses it; otherwise, the internal one is used.

That's a bad test:  class(object) might be a vector c("nomethod", "hasmethod").  You're only looking for recover_data.nomethod, and maybe only recover_data.hasmethod exists.

The getS3method() function won't automatically iterate through the class, you'll need to do that yourself, for example

S3methodOrDefault <- function(object, generic, default) {
   for (c in class(object)) {
     rd <- try(getS3method(generic, c, envir = .GlobalEnv, silent = TRUE))
     if (!inherits(rd, "try-error"))
       return(rd)
   }
   return(default)
}

used as

   S3methodOrDefault(object, "recover_data", internal_recover_data)

Duncan Murdoch



More information about the R-package-devel mailing list