Hello,

>From getS3method documentation, it is expected to be consistent with a call to 
>the generic function in the environment it is called from.


> It is possible that which S3 method will be used may depend on where the 
> generic f is

> called from: getS3method returns the method found if f were called from the 
> same environment."


# the following code shows an inconsistency on R

# tested on 4.5.1 (2025-06-13 ucrt) (x86_64-w64-mingw32/x64)

local({
    coef.lm=function(x, ...) {cat("new coef.lm function\n")}
    attach(environment(), name="test.env")
})

mod = lm(I(1:3)~1)
getS3method("coef", "lm")(mod) # uses the new coef.lm function
coef(mod) # uses coef.default of package stats
detach("test.env")


I also tested the old versions of R I kept on my computer.

R 4.0.3 : same behaviour as R 4.5.1

R 3.6.3 : both lines of code call the new coef.lm function


When looking at old R release NEWS for R 4.0.0, I got a possible explanation:

> S3 method lookup now by default skips the elements of the search path between 
> the global and base environments


Therefore, it looks like R_LookupMethod() was updated in src/main/objects.c but 
not getS3method() in src/library/utils/R/objects.R

I found the commit that seems to have caused the change in behaviour:

https://github.com/wch/r-source/commit/753ceaea9854d0b4d7a363041f0176ecc1b036fb<https://astragale.chu-rouen.fr/https/chu-rouen/gw-chu-rouen-03/github.com/wch/r-source/commit/753ceaea9854d0b4d7a363041f0176ecc1b036fb>


<https://astragale.chu-rouen.fr/https/chu-rouen/gw-chu-rouen-03/github.com/wch/r-source/commit/753ceaea9854d0b4d7a363041f0176ecc1b036fb>

Actually, when launching R 4.0.3 with the 
_R_S3_METHOD_LOOKUP_BASEENV_AFTER_GLOBALENV_=FALSE system environment variable 
set, I can reproduce the old R 3.6.3 behaviour, but not in R 4.5.1, because 
this environment variable was completely removed:

https://github.com/wch/r-source/commit/58a2da9d8e506c33f33c16a3a87584be0ab013d6<https://astragale.chu-rouen.fr/https/chu-rouen/gw-chu-rouen-03/github.com/wch/r-source/commit/58a2da9d8e506c33f33c16a3a87584be0ab013d6>


Unless I miss something, getS3method() should be updated to be consistent with 
the actual method lookup mechanism.


--

Sincerely

Andr� GILLIBERT

        [[alternative HTML version deleted]]

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to