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]]
This is a side effect of the lazy evaluation done in functions. Look at the help page for the force function for more details and how to force evaluation and solve your problem. -- Gregory (Greg) L. Snow Ph.D. Statistical Data Center Intermountain Healthcare greg.snow at imail.org 801.408.8111> -----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 1: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]] > > ______________________________________________ > 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.
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]]
>
> ______________________________________________
> 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.
>
Hello again.
Let me try something a little more intricate. Let's say instead of
forcing evaluation of 'i' I'd want to force evaluation of a vector;
for example:
s <- c( 0.2, 0.45, 0.38, 0.9)
f <- lapply(1:10, function(i)local({ force(i) ; function(x)x^2+s[i]}))
rm(s)
f[[1]](0.1)
Error in f[[1]](0.1) : object 's' not found
Any thoughts?
Best regards,
Eduardo
> sessionInfo()
R version 2.11.1 (2010-05-31)
x86_64-pc-mingw32
locale:
[1] LC_COLLATE=Portuguese_Brazil.1252 LC_CTYPE=Portuguese_Brazil.1252
[3] LC_MONETARY=Portuguese_Brazil.1252 LC_NUMERIC=C
[5] LC_TIME=Portuguese_Brazil.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] Revobase_4.2.0 RevoScaleR_1.1-1 lattice_0.19-13
loaded via a namespace (and not attached):
[1] grid_2.11.1 pkgXMLBuilder_1.0 revoIpe_1.0 tools_2.11.1
[5] XML_3.1-0
> 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]]
>>>
>>> ______________________________________________
>>> 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.
>>>
>>
>