On Mon, Nov 15, 2010 at 7:10 PM, William Dunlap <wdunlap at tibco.com> wrote:
You could make f[[i]] be function(t)t^2+i for i in 1:10
with
? ? f <- lapply(1:10, function(i)local({ force(i) ; function(x)x^2+i}))
After that we get the correct results
? ?> f[[7]](100:103)
? ?[1] 10007 10208 10411 10616
but looking at the function doesn't immdiately tell you
what 'i' is in the function
? ?> f[[7]]
? ?function (x)
? ?x^2 + i
? ?<environment: 0x19d7458>
You can find it in f[[7]]'s environment
? ?> get("i", envir=environment(f[[7]]))
? ?[1] 7
The call to force() in the call to local() is not
necessary in this case, although it can help in
other situations.
Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com
-----Original Message-----
From: r-help-bounces at r-project.org
[mailto:r-help-bounces at r-project.org] On Behalf Of Eduardo de
Oliveira Horta
Sent: Monday, November 15, 2010 12:50 PM
To: r-help at r-project.org
Subject: [R] Defining functions inside loops
Hello,
I was trying to define a set of functions inside a loop, with
the loop index
working as a parameter for each function. Below I post a
simpler example, as
to illustrate what I was intending:
f<-list()
for (i in 1:10){
? f[[i]]<-function(t){
? ? f[[i]]<-t^2+i
? }
}
rm(i)
With that, I was expecting that f[[1]] would be a function
defined by t^2+1,
f[[2]] by t^2+2 and so on. However, the index i somehow
doesn't "get in" the
function definition on each loop, that is, the functions
f[[1]] through
f[[10]] are all defined by t^2+i. Thus, if I remove the
object i from the
workspace, I get an error when evaluating these functions.
Otherwise, if
don't remove the object i, it ends the loop with value equal
to 10 and then
f[[1]](t)=f[[2]](t)=...=f[[10]](t)=t^2+10.
I am aware that I could simply put
f<-function(u,i){
? f<-t^2+i
}
but that's really not what I want.
Any help would be appreciated. Thanks in advance,
Eduardo Horta
? ? ? [[alternative HTML version deleted]]