IAGO GINÉ VÁZQUEZ
2019-Jun-17 07:56 UTC
[Rd] Could generic functions check different S3 methods for an object when one of them produces an error?
Hi, Let's say one has an object with multiple classes, and a generic function to apply to it has associated S3 methods for more than one of those classes. Further, the method it chooses (I do not know how; some order in the class vector?) is not the suitable one and it produces an error. Would there be some way to make the generic function to choice the correct method, or in case that for any method taken it produces an error, to try another one. For example (commented in detail here<https://github.com/tidymodels/broom/issues/714>): # object with multiple classes: the output of function `geepack::geeglm`. The output of `class(object)`: ``` [1] "geeglm" "gee" "glm" "lm" ``` The generic function: `stats::confint`. The S3 method chosen: `confint.glm`. It produces an error. The correct method in this case would be `broom:::confint.geeglm`. Thank you! Iago [[alternative HTML version deleted]]
Duncan Murdoch
2019-Jun-18 15:28 UTC
[Rd] Could generic functions check different S3 methods for an object when one of them produces an error?
On 17/06/2019 3:56 a.m., IAGO GIN? V?ZQUEZ wrote:> Hi, > > > Let's say one has an object with multiple classes, and a generic function to apply to it has associated S3 methods for more than one of those classes. Further, the method it chooses (I do not know how; some order in the class vector?) is not the suitable one and it produces an error. Would there be some way to make the generic function to choice the correct method, or in case that for any method taken it produces an error, to try another one. > > > For example (commented in detail here<https://github.com/tidymodels/broom/issues/714>): > > > # object with multiple classes: the output of function `geepack::geeglm`. The output of `class(object)`: > > ``` > > [1] "geeglm" "gee" "glm" "lm" > > ``` > > The generic function: `stats::confint`. > > The S3 method chosen: `confint.glm`. It produces an error. The correct method in this case would be `broom:::confint.geeglm`.There is something wrong here. If R knows about confint.geeglm (because broom is loaded, for example), then confint(x) should call it before it calls confint.glm. It will look for methods confint.geeglm, then confint.gee, then confint.glm, then confint.lm. However, when I run your code and load broom, I see > methods("confint") [1] confint.default confint.glm* confint.lm confint.lme* confint.lmList* confint.nls* confint.nlsList* see '?methods' for accessing help and source code (with no confint.geeglm shown). So something is wrong, probably in broom. As far as I can see, it never declares confint.geeglm as an S3method in its NAMESPACE file. (I'm looking at the devel version in https://github.com/tidymodels/broom/blob/master/NAMESPACE). Get that fixed, and your problem should go away. Duncan Murdoch
Apparently Analagous Threads
- Could generic functions check different S3 methods for an object when one of them produces an error?
- using step() with package geepack
- Generalised Estimating Equations on approx normal outcome with limited range
- confint Attempts to Use All Server CPUs by Default
- geepack installation problem?