From konrad.rudolph+r-devel at gmail.com  Fri Dec 11 13:56:18 2015
From: konrad.rudolph+r-devel at gmail.com (Konrad Rudolph)
Date: Fri, 11 Dec 2015 12:56:18 +0000
Subject: [Rd] How do I reliably and efficiently hash a function?
In-Reply-To: <CAOKDuOivxrh_Ti8U+AwvNeAq5a3Snz4=WSftSMgEiW2bA4aoRg@mail.gmail.com>
References: <CAM2gKPbSZjLUpVW87iaKczF-2eDHiT6GReu28SBJ98mSt8Djcg@mail.gmail.com>
	<alpine.OSX.2.20.1512101810510.2980@charles-berrys-macbook.local>
	<CAOKDuOivxrh_Ti8U+AwvNeAq5a3Snz4=WSftSMgEiW2bA4aoRg@mail.gmail.com>
Message-ID: <CAM2gKPa2YpWh_umEzNeUP=E9oLwnkY2pEtSDaAkOmEMSH846eA@mail.gmail.com>

Thanks. I know about `local` (and functions within functions). In
fact, the functions are *already* defined inside their own environment
(same as what `local` does). But unfortunately this doesn?t solve my
problem, since the functions? parent environment gets changed during
the function?s execution, and I need to retrieve my stored data
*after* that point, inside the function.

I?ve tried to create a more exact example of what?s going on ?
unfortunately it?s really hard to simplify the problem without losing
crucial details. Since the code is just a tad too long, I?ve posted it
as a Github Gist:

https://gist.github.com/klmr/53c9400e832d7fd9ea5c

The function `f` in the example calls `get_meta()` twice, and gets
different results before and after calling an ancillary function that
modifies the function?s `parent.env`. I want it to return the same
information (?original?) both times.

On Fri, Dec 11, 2015 at 10:49 AM, Mark van der Loo
<mark.vanderloo at gmail.com> wrote:
> In addition to what Charles wrote, you can also use 'local' if you don't
> want a function that creates another function.
>
>> f <- local({info <- 10; function(x) x + info})
>> f(3)
> [1] 13
>
> best,
> Mark
>
>
> Op vr 11 dec. 2015 om 03:27 schreef Charles C. Berry <ccberry at ucsd.edu>:
>>
>> On Thu, 10 Dec 2015, Konrad Rudolph wrote:
>>
>> > I?ve got the following scenario: I need to store information about an
>> > R function, and retrieve it at a later point. In other programming
>> > languages I?d implement this using a dictionary with the functions as
>> > keys. In R, I?d usually use `attr(f, 'some-name')`. However, for my
>> > purposes I do not want to use `attr` because the information that I
>> > want to store is an implementation detail that should be hidden from
>> > the user of the function (and, just as importantly, it shouldn?t
>> > clutter the display when the function is printed on the console).
>> >
>> > `comment` would be almost perfect since it?s hidden from the output
>> > when printing a function ? unfortunately, the information I?m storing
>> > is not a character string (it?s in fact an environment), so I cannot
>> > use `comment`.
>> >
>> > How can this be achieved?
>> >
>>
>> See
>>
>> https://cran.r-project.org/doc/manuals/r-release/R-intro.html#Scope
>>
>> For example, these commands:
>>
>> foo <- function() {info <- "abc";function(x) x+1}
>> func <- foo()
>> find("func")
>> func(1)
>> ls(envir=environment(func))
>> get("info",environment(func))
>> func
>>
>> Yield these printed results:
>>
>> : [1] ".GlobalEnv"
>> : [1] 2
>> : [1] "info"
>> : [1] "abc"
>> : function (x)
>> : x + 1
>> : <environment: 0x7fbd5c86bc60>
>>
>> The environment of the function gets printed, but 'info' and other
>> objects that might exist in that environment do not get printed unless
>> you explicitly call for them.
>>
>> HTH,
>>
>> Chuck
>>
>> p.s. 'environment(func)$info' also works.
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel



[Rd] How do I reliably and efficiently hash a function?
Konrad Rudolph