Skip to content
Prev 59178 / 63421 Next

all.equal applied to function closures

To make the comparison more complete, all.equal.environment could compare
the parents of the target and current environments.  That would have to be
recursive but could stop at the first 'top level environment' (the global,
empty, or a package-related environment generally) and use identical
there.  E.g.,
[1] "Environments: Component ?expx?: Mean relative difference: 1.718282"

[2] "Environments: <parent.env> Component ?x?: Mean relative difference:
0.5"

This is from the following, where I avoided putting the existing
non-recursive all.equal.environment into the body of this one.

all.equal.environment <-
function(target, current, ...)
{
    .all.equal.environment <- base::all.equal.environment # temporary hack
    stopifnot(is.environment(target), is.environment(current))
    if (identical(target, current)) {
        TRUE
    } else {
        msg <- NULL # TODO: check attributes
        # deal with emptyenv now since parent.env(emptyenv()) gives error
        # and topenv(emptyenv()) gives GlobalEnv
        eTarget <- identical(target, emptyenv()) ||
identical(target,topenv(target))
        eCurrent <- identical(current, emptyenv()) ||
identical(current,topenv(current))
        if (eTarget || eCurrent) {
            msg <- c(msg, paste("target is", format(target), "and current
is", format(current)))
        } else {
            thisComparison <- .all.equal.environment(target, current, ...)
            if (!isTRUE(thisComparison)) {
                msg <- c(msg, thisComparison)
            }
            parentComparison <- Recall(parent.env(target),
parent.env(current), ...)
            if (!isTRUE(parentComparison)) {
                msg <- c(msg, paste("<parent.env>", parentComparison))
            }
        }
        if (is.null(msg) || isTRUE(msg)) TRUE else msg
    }
}

On Mon, Nov 30, 2020 at 10:42 AM Duncan Murdoch <murdoch.duncan at gmail.com>
wrote: