The try this: > s <- c( 0.2, 0.45, 0.38, 0.9) > f <- lapply(1:10, function(i) + local({ + local_s <- s[i] + function(x)x^2+local_s + })) > rm(s) > f[[2]](4) [1] 16.45 >
On Tue, Feb 15, 2011 at 10:53 AM, Eduardo de Oliveira Horta <eduardo.oliveiraho...@gmail.com> wrote: > Thanks... but I guess I didn't make myself clear. What I was trying to > do was precisely to "store" inside the function the number associated > to s[i] rather than the call to s[i], such that I wouldn't need to > keep that object in subsequent function calls. > > In other words, I wanted to use lapply to get functions equivalent to: > s <- c( 0.2, 0.45, 0.38, 0.9) > f <-list() > f[[1]] <- function(x) x^2+0.2 > f[[2]] <- function(x) x^2+0.45 > f[[3]] <- function(x) x^2+0.38 > f[[4]] <- function(x) x^2+0.9 > > Best regards, > > Eduardo > > > On Tue, Feb 15, 2011 at 7:20 AM, Dennis Murphy <djmu...@gmail.com> wrote: >> Hi: >> >> If you look at the error message, you'll see that you removed s before >> evaluating f, and since an element of s is called in the function.... >> >> Try >>> 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]})) >>> f[[1]](s) >> [1] 0.2400 0.4025 0.3444 1.0100 >> >> f is a list with 10 components, the first of which is >> [[1]] >> function (x) >> x^2 + s[i] >> <environment: 0x0000000002a26d48> >> >> Each component occupies a different environment. To see what you get, >> >>> f[[1]](0.1) >> [1] 0.21 >> >>> for(i in 1:10) print(f[[i]](i)) >> [1] 1.2 >> [1] 4.45 >> [1] 9.38 >> [1] 16.9 >> [1] NA >> [1] NA >> [1] NA >> [1] NA >> [1] NA >> [1] NA >> >>> for(i in 1:10) print(f[[i]](1)) >> [1] 1.2 >> [1] 1.45 >> [1] 1.38 >> [1] 1.9 >> [1] NA >> [1] NA >> [1] NA >> [1] NA >> [1] NA >> [1] NA >> >> HTH, >> Dennis >> >> On Mon, Feb 14, 2011 at 9:50 PM, Eduardo de Oliveira Horta >> <eduardo.oliveiraho...@gmail.com> wrote: >>> >>> 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. >> >> > > ______________________________________________ > 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. > -- Jim Holtman Data Munger Guru What is the problem that you are trying to solve? ______________________________________________ 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.