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. >>> >> >