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

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

Reply via email to