Skip to content
Back to formatted view

Raw Message

Message-ID: <56D73E0E.9080404@aalto.fi>
Date: 2016-03-02T19:25:02Z
From: Mikko Korpela
Subject: Functional programming?
In-Reply-To: <3D6E9AAB-1BA6-4E2D-AF26-824772E7EE5A@illinois.edu>

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