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 <wdun...@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-boun...@r-project.org >>> [mailto:r-help-boun...@r-project.org] On Behalf Of Eduardo de >>> Oliveira Horta >>> Sent: Monday, November 15, 2010 12:50 PM >>> To: r-help@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@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. >>> >> > ______________________________________________ R-help@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.