On 12/10/2015 9:51 AM, Ben Bolker wrote: > Duncan Murdoch <murdoch.duncan <at> gmail.com> writes: > > BB> >>>> It seems odd/inconvenient to me that the "ignore.environment" argument >>>> of identical() only applies to closures (which I read as 'functions' -- >>>> someone can enlighten me about the technical differences between >>>> functions and closures if they like -- see below for consequences of my >>>> confusion). This is certainly not a bug, it's clearly documented, but >>>> it seems like a design flaw. It would certainly be convenient to be >>>> able to ignore differences in environments when comparing complex >>>> objects with lots of deeply nested formula and terms objects with >>>> environments ... >>>> >>>> Can anyone suggest a reason for this design? >>>> > > [snip] > >>>> Actually, maybe I don't understand how this is supposed to work since I >>>> thought this would be TRUE: >>>> >>>>> f1 <- function() {} >>>>> f2 <- function() {} >>>>> environment(f1) <- new.env() >>>>> environment(f2) <- new.env() >>>>> identical(f1,f2,ignore.environment=TRUE) ## FALSE >>> >>> Those two functions likely have different srcref attributes. If you >>> created f2 using f2 <- f1, you'd get your expected result. >>> > > [snip] > > Thanks for the clarification about closures vs. functions. > > [snip] > > You're right that the srcref attributes are different; although their > bodies are the same, they have their own environments that differ. > For me, this makes the intended use of ignore.environment= even more > puzzling; given that environments are not ignored recursively (that's > not exactly what I mean -- I mean ignoring all environments of components > of an object), I have trouble understanding the use case for > ignore.environnment ... maybe it was developed before srcrefs > existed?
I think it simply means "ignore.environment.of.closures", as the description says, but that's too long to be a convenient arg name. Closures have three parts: the formals, the body and the environment. (Actually, 4 parts: like almost all R objects, they may also have attributes.) That arg just says to ignore the environment part when comparing closures. It doesn't say to ignore environments in general. > > In the R code base it's used in checkConflicts (to see if a function > is re-exported) and in getAnywhere ... > I'd say those uses are slightly bogus. You should generally remember that closures have 3 (or 4) parts, and not go around comparing only two (or 3) of them. Duncan Murdoch ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel