[R] Functional programming?

Bert Gunter bgunter.4567 at gmail.com
Wed Mar 2 21:17:26 CET 2016


Thanks, Roger:

I think Duncan's approach is far more efficient, but I believe the
following replicates your result and may be a bit easier to
understand.

f <- function(u) function(x) u * x^2
g <- function(u) function(x) u * log(x)
set.seed(3)
a <- runif(5)
h <- list()
hit <- list()
h[[1]] <- f(a[1])
hit[[1]] <- f(a[1])
for(i in 2:5) h[[i]] <- eval(bquote(function(x)h[[.(i-1)]](x)*g(a[.(i)])(x)))
x <- 1:99/10
plot(x, h[[1]](x), type = "l")
for(i in 2:5){
  lines(x, h[[i]](x), col = i)
}

This uses recursion to "unwind" h[[i]] each time it's called, ergo
the inefficiency. But in that sense,anyway,  it seems to be more
"functional."

But certainly feel free to ignore.

Cheers,
Bert
Bert Gunter

"The trouble with having an open mind is that people keep coming along
and sticking things into it."
-- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )


On Wed, Mar 2, 2016 at 10:40 AM, Roger Koenker <rkoenker at illinois.edu> wrote:
> Thanks, Duncan and Bert,
>
> Duncan’s version does replicate my result, Bert’s does something a bit different,
> now I just need some time to digest what you have done, and try to see how
> and why.  Many thanks!!!
>
> Roger
>
> url:    www.econ.uiuc.edu/~roger            Roger Koenker
> email    rkoenker at uiuc.edu            Department of Economics
> vox:     217-333-4558                University of Illinois
> fax:       217-244-6678                Urbana, IL 61801
>
>> On Mar 2, 2016, at 12:23 PM, Duncan Murdoch <murdoch.duncan at gmail.com> wrote:
>>
>> On 02/03/2016 11:47 AM, Roger Koenker wrote:
>>> I have a (remarkably ugly!!) code snippet  (below) that, given
>>> two simple functions, f and g,  generates
>>> a list of new functions h_{k+1} =  h_k * g, k= 1, …, K.  Surely, there are vastly
>>> better ways to do this.  I don’t particularly care about the returned list,
>>> I’d be happy to have the final  h_K version of the function,
>>> but I keep losing my way and running into the dreaded:
>>>
>>> Error in h[[1]] : object of type 'closure' is not subsettable
>>> or
>>> Error: evaluation nested too deeply: infinite recursion / options(expressions=)?
>>>
>>> Mainly I’d like to get rid of the horrible, horrible paste/parse/eval evils.  Admittedly
>>> the f,g look a bit strange, so you may have to suspend disbelief to imagine that there is
>>> something more sensible lurking beneath this minimal (toy)  example.
>>>
>>>     f <- function(u) function(x) u * x^2
>>>     g <- function(u) function(x) u * log(x)
>>>     set.seed(3)
>>>     a <- runif(5)
>>>     h <- list()
>>>     hit <- list()
>>>     h[[1]] <- f(a[1])
>>>     hit[[1]] <- f(a[1])
>>>     for(i in 2:5){
>>>      ht <- paste("function(x) h[[", i-1, "]](x) * g(", a[i], ")(x)")
>>>      h[[i]] <- eval(parse(text = ht))
>>>      hit[[i]] <- function(x) {force(i); return(h[[i]] (x))}
>>>      }
>>>     x <- 1:99/10
>>>     plot(x, h[[1]](x), type = "l")
>>>     for(i in 2:5)
>>>      lines(x, h[[i]](x), col = i)
>>
>> I don't understand what "hit" is for, but something like this should do it:
>>
>>
>> hlist <- function(maxk, f,g,a) {
>>   h <- list()
>>   h[[1]] <- f(a[1])
>>   for (j in 2:maxk) {
>>     h[[j]] <- local({
>>       k <- j
>>       function(x) {
>>         result <- h[[1]](x)
>>         for (i in 2:k) {
>>           result <- result*g(a[i])(x)
>>         }
>>         result
>>       }
>>     })
>>   }
>>   h
>> }
>>
>> f <- function(u) function(x) u * x^2
>> g <- function(u) function(x) u * log(x)
>> set.seed(3)
>> a <- runif(5)
>> h <- hlist(5, f, g, a)
>



More information about the R-help mailing list