From murdoch.duncan at gmail.com  Mon Oct 12 04:42:25 2015
From: murdoch.duncan at gmail.com (Duncan Murdoch)
Date: Sun, 11 Oct 2015 22:42:25 -0400
Subject: [Rd] identical(..., ignore.environment=TRUE)
In-Reply-To: <561B1C93.3060803@gmail.com>
References: <561AF92D.90801@gmail.com> <561B1C93.3060803@gmail.com>
Message-ID: <561B1E11.7050103@gmail.com>

On 11/10/2015 10:36 PM, Duncan Murdoch wrote:
> On 11/10/2015 8:05 PM, Ben Bolker wrote:
>>
>>   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?
>>
>> Example:
>>
>>> f1 <- formula()
>>> f2 <- formula()
>>> environment(f2) <- new.env()
>>> identical(f1,f2)
>> [1] FALSE
>>> identical(f1,f2,ignore.environment=TRUE)
>> [1] FALSE
>>
>> 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.
> 
>>
>>   Maybe the problem *is* that I don't know the difference between a
>> function and a closure ... ?
> 
> In R, there is no difference.  All functions are closures.
> 
> Some people only use "closure" for functions returned as the value of
> other functions.  That may be correct usage in other languages, but not
> in R.

Sorry, I meant all user functions are closures.  There are other kinds
of function in R called "primitives" (e.g. c(), many low level math
functions, the functions that implement flow control, etc.).

Duncan Murdoch



[Rd] identical(..., ignore.environment=TRUE)
Duncan Murdoch