All,

I'm going with the previous approach, as modified by Duncan, primarily because 
I want to keep recover_data.lm and a few others. 
So if I fit a model 'm3' using stanreg::rstanarm:
 
    class(m3)
    [1] "stanreg" "glm"     "lm"      "lmerMod"

Using the setup that Luke suggests, I have a default_recover_data.stanreg() 
method, but it is not used because it finds the lm method instead of going to 
recover_data.default. 

Russ

-----Original Message-----
From: Tierney, Luke <luke-tier...@uiowa.edu> 
Sent: Saturday, August 10, 2019 3:15 PM
To: Lenth, Russell V <russell-le...@uiowa.edu>
Cc: Duncan Murdoch <murdoch.dun...@gmail.com>; Iñaki Ucar 
<iu...@fedoraproject.org>; r-package-devel@r-project.org
Subject: Re: [R-pkg-devel] [External] Re: Farming out methods to other packages

You could have your default method handle the cases you can handle; if you want 
that to dispatch you can use something like

recover_data.default <- function(object, ...)
     default_recover_data(object, ...)
default_recover_data <- function(object, ...)
     UseMethod("default_recover_data")

Best,

luke

    . . .

> -----Original Message-----
> From: Duncan Murdoch <murdoch.dun...@gmail.com>
> Sent: Saturday, August 10, 2019 2:43 PM
> To: Lenth, Russell V <russell-le...@uiowa.edu>; Iñaki Ucar 
> <iu...@fedoraproject.org>
> Cc: r-package-devel@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

______________________________________________
R-package-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-package-devel

Reply via email to