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.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