On 30/11/2020 1:05 p.m., Kevin Van Horn via R-devel wrote:
Consider the following code:
f <- function(x)function(y){x+y}
all.equal(f(5), f(0))
This returns TRUE, when it should return FALSE; I think it’s hard to make the
case that f(5) and f(0) are “approximately equal” in any meaningful sense.
Digging into the code for all.equal(), I see that all.equal(f(5), f(0)) results
in a call to all.equal.language(f(5), f(0)), which only compares the function
texts for equality.
If it is decided to leave this behavior as-is, then at least it should be
documented. Currently I cannot find any documentation for all.equal applied to
functions.
Clearly it should also compare the environments of the two functions,
then it would see a difference:
> all.equal(environment(f(5)), environment(f(0)))
[1] "Component “x”: Mean relative difference: 1"
Changing the first few lines from
if (is.language(target) || is.function(target))
return(all.equal.language(target, current, ...))
to
if (is.function(target)) {
msg <- all.equal.language(target, current, ...)
if (isTRUE(msg)) {
msg <- all.equal.environment(environment(target),
environment(current), ...)
if (is.character(msg))
msg <- paste("Environments:", msg)
}
return(msg)
}
if (is.language(target))
return(all.equal.language(target, current, ...))
would fix it.
Duncan Murdoch
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel