Dear Wolfgang, I think this new behaviour is related to the following R 4.0.0 NEWS item:
> S3 method lookup now by default skips the elements of the search path between > the global and base environments. Your environment "myenv" is attached at position 2 of the search() path and thus now skipped in S3 method lookup. I have just noticed that attr(methods(class="myclass"), "info") getS3method("print", "myclass") both still find your function in myenv although the generic's UseMethod() won't. I find this a bit confusing. A solution to make R >= 4.0.0 find your method is to register the S3 method using the new function .S3method (intended for R scripts, not packages). After running .S3method("print", "myclass", myenv$print.myclass) your method will be found from the generic. Best regards, Sebastian Am 12.05.20 um 20:05 schrieb Viechtbauer, Wolfgang (SP): > Dear All, > > In R 3.6.3 (and earlier), method dispatch used to work for methods stored in > local environments that are attached to the search path. For example: > > myfun <- function(y) { > out <- list(y=y) > class(out) <- "myclass" > return(out) > } > > print.myclass <- function(x, ...) print(formatC(x$y, format="f", digits=5)) > > myfun(1:4) > > # prints: [1] "1.00000" "2.00000" "3.00000" "4.00000" > > rm(print.myclass) > myenv <- new.env() > myenv$print.myclass <- local(function(x, ...) print(formatC(x$y, format="f", > digits=5)), myenv) > attach(myenv) > myfun(1:4) > > # still prints: [1] "1.00000" "2.00000" "3.00000" "4.00000" > > But since R 4.0.0, this no longer words and the above prints: > > $y > [1] 1 2 3 4 > > attr(,"class") > [1] "myclass" > > Is this intended? And is there a way to still make this work? > > Best, > Wolfgang > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel