Indeed, that works: myfun <- function(y) { out <- list(y=y) class(out) <- "myclass" return(out) }
myenv <- new.env() myenv$print.myclass <- local(function(x, ...) print(formatC(x$y, format="f", digits=5)), new.env(myenv)) .S3method("print", "myclass", myenv$print.myclass) attach(myenv) myfun(1:4) # [1] "1.00000" "2.00000" "3.00000" "4.00000" Thanks for the tip! Best, Wolfgang >-----Original Message----- >From: Martin Maechler [mailto:maech...@stat.math.ethz.ch] >Sent: Tuesday, 12 May, 2020 21:05 >To: Viechtbauer, Wolfgang (SP) >Cc: r-devel (r-devel@r-project.org) >Subject: Re: [Rd] S3 method dispatch for methods in local environments > >>>>>> Viechtbauer, Wolfgang (SP) >>>>>> on Tue, 12 May 2020 18:05:32 +0000 writes: > > > 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? > >yes, most probably, unless > > > And is there a way to still make this work? > >Using the new > > .S3method(<generic>, <class>, <method_function>) > >had been intended as substitute. Can you try it with your >attached-environment (which makes sense!) approach ? > >Best, >Martin ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel