[Rd] all.equal applied to function closures
Duncan Murdoch
murdoch@dunc@n @end|ng |rom gm@||@com
Mon Nov 30 19:36:50 CET 2020
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
More information about the R-devel
mailing list