Functional programming?
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)