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.