[Rd] S3 dispatch does not work for generics defined inside an environment
Taras Zakharko
t@r@@@z@kh@rko @end|ng |rom uzh@ch
Wed Jun 30 11:22:15 CEST 2021
Dear all,
I have a generic function and a bunch of methods defined in a separate environment. Here is a reduced example:
env <- local({
# define the generic function and the method
myfun <- function(x) UseMethod("myfun")
myfun.myclass <- function(x) print("called myfun.myclass”)
# register the method
.S3method("myfun", "myclass", myfun.myclass)
environment()
})
Since the method has been registered, I hoped that invocation like this would work:
env$myfun(structure(0, class = "myclass”))
However, this results in a “no applicable method" error.
It is my understanding that registerS3method (called by .S3method) will install the method string in the .__S3MethodsTable__. table of the environment where the generic function is defined, and this table is subsequently used by usemethod() inside R, so I am puzzled that the dispatch does not work. I checked and the .__S3MethodsTable__. of env is indeed setup correctly. I also tried manually adding the method string to the global .__S3MethodsTable__. inside .BaseNamespaceEnv to no effect.
In fact, the only way to make it work is to define either myfun or myfun.myclas in the global environment, which is something I would like to avoid.
Thank you in advance for any pointers!
Best,
Taras
P.S. If you are wondering what I am trying to achieve here — we have a very large codebase and I am trying to use environments as a type of “poor man’s namespaces” to organize code in a modular fashion. But of course it’s all pointless if I can’t get the generics to work reliably.
More information about the R-devel
mailing list