Re: [R] functional (?) programming in r

From: jim holtman <jholtman_at_gmail.com>
Date: Mon, 17 Nov 2008 20:50:52 -0500

You can use the 'local' function to make sure you create a value of 'i' that is defined when the function is defined:

> funcs = lapply(1:5, function(i)local({i; function(){ i}}))
> funcs[[3]]()

[1] 3
> funcs[[2]]()

[1] 2

On Mon, Nov 17, 2008 at 4:28 PM, Wacek Kusnierczyk <Waclaw.Marcin.Kusnierczyk_at_idi.ntnu.no> wrote:
> the following is a trivialized version of some functional code i tried
> to use in r:
>
> (funcs = lapply(1:5, function(i) function() i))
> # a list of no-parameter functions, each with its own closure environment,
> # each supposed to return the corresponding index when applied to no
> arguments
>
> sapply(funcs, function(func) func())
> # supposed to return c(1,2,3,4,5)
>
> there is absolutely nothing unusual in this code, in the context of
> functional programming.
> the following is my best translation to python (modulo indexing, which
> is inessential), where it does what i wanted:
>
> funcs = map(lambda i: lambda: i, range(5))
> map(lambda func: func(), funcs)
> # [0,1,2,3,4]
>
> all these functions have distinct environments:
>
> (envs = sapply(funcs, function(func) environment(func)))
> assign("i", 0, environment(envs[[1]]))
> sapply(funcs, function(func) func())
>
> interestingly, identical says they are all unequal, but compare disagrees.
>
> check = function(equal) for (i in 1:4) for (j in i:4+1)
> print(equal(envs[[i]], envs[[j]]))
> check(identical)
> check(compare)
>
> compare seems to cast environments to character; for identical, the docs
> give an example where environments are compared, but compare fails
> (i.e., succeeds) miserably (the docs do not warn not to compare
> environments):
>
> e1 = new.env(parent=emptyenv())
> e2 = new.env(parent=emptyenv())
> assign("foo", "bar", e1)
> compare(e1, e2)
> # oops?
>
>
> back to the original example, how come?
>
> vQ
>
>
> ----
> for those curious, try the following in python:
>
> map(lambda func: func(), [lambda: i for i in range(5)])
> map(lambda func: func(), (lambda: i for i in range(5)))
>
> ______________________________________________
> R-help_at_r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>

-- 
Jim Holtman
Cincinnati, OH
+1 513 646 9390

What is the problem that you are trying to solve?

______________________________________________
R-help_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
Received on Tue 18 Nov 2008 - 01:55:01 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Tue 18 Nov 2008 - 09:30:26 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.

list of date sections of archive