[R] Functional programming?

Roger Koenker rkoenker at illinois.edu
Wed Mar 2 23:55:35 CET 2016


Thanks again to all.  This was highly educational for me.  As it turned out
Mikiko's suggestion turned out to be most easily adaptable to my real problem.
I’m not at all able to evaluate relative efficiency at this point, but fortunately this isn’t
an important factor (so far) in what I’m trying to do.

As always the knowledge and generosity of the R-help community is inspiring.


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 1:25 PM, Mikko Korpela <mikko.korpela at aalto.fi> wrote:
> 
> On 02.03.2016 18:47, 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)
> 
> Here is my (ugly?) suggestion:
> 
> f <- function(u) function(x) u * x^2
> g <- function(u) function(x) u * log(x)
> set.seed(3)
> a <- runif(5)
> h <- f(a[1])
> for (i in 2:5) {
>    body(h) <- call("*", body(h),
>                    as.call(list(do.call("g", list(a[i])), quote(x))))
> }
> 
> -- 
> Mikko Korpela
> Aalto University School of Science
> Department of Computer Science



More information about the R-help mailing list