From @eb@meyer @end|ng |rom |@u@de  Tue May 12 21:17:25 2020
From: @eb@meyer @end|ng |rom |@u@de (Sebastian Meyer)
Date: Tue, 12 May 2020 21:17:25 +0200
Subject: [Rd] S3 method dispatch for methods in local environments
In-Reply-To: <eed0ec0eb8e647c49250eae4dc9570db@UM-MAIL3214.unimaas.nl>
References: <eed0ec0eb8e647c49250eae4dc9570db@UM-MAIL3214.unimaas.nl>
Message-ID: <c03dbde7-9205-581b-da38-91553074aed2@fau.de>

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 at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>



[Rd] S3 method dispatch for methods in local environments
Sebastian Meyer