[R] Defining functions inside loops

jim holtman jholtman at gmail.com
Tue Feb 15 15:17:50 CET 2011


You can also create a local copy of 's' in the function:

> s <- c( 0.2, 0.45, 0.38, 0.9)
> f  <- lapply(1:10, function(i)
+     local({ force(i)
+             local_s <- s
+             function(x)x^2+local_s[i]
+           }))
> rm(s)
> f[[2]](4)
[1] 16.45
>


On Tue, Feb 15, 2011 at 12:50 AM, Eduardo de Oliveira Horta
<eduardo.oliveirahorta at 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 <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.
>>>>
>>>
>>
>
> ______________________________________________
> 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.
>



-- 
Jim Holtman
Data Munger Guru

What is the problem that you are trying to solve?



More information about the R-help mailing list