[R] Functional programming?

Roger Koenker rkoenker at illinois.edu
Wed Mar 2 19:40:58 CET 2016


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